Java Memory Model
Stack 栈 : 存放基本类型变量
优势是速度快,Stack(存取速度仅次于计算机的寄存器),数据可共享
缺点是存的数据大小和生存期必须是确定的。
Heap 堆: 存放new创建的对象和数组,对象的引用变量都在函数的栈内存中分配。
由垃圾回收来负责的,即堆内存中的实体不再被指向时,JVM启动垃圾回收机制。
缺点是因为在运行时动态分配内存,所以存取速度 < 栈;
Heap&Stack原理图【补充】
如果两个线程同时调用了同一个对象,那两线程都拥有这个对象的私有拷贝
JMM和硬件结构的关联【补充】
read(读取):作用于主内存的变量,它把一个变量的值从主内存传输到线程的工作内存中,以便随后的load动作使用。
load(载入):作用于工作内存的变量,它把read操作从主内存中得到的变量值放入工作内存的变量副本中
store(存储):作用于工作内存的变量,它把工作内存中一个变量的值传送到主内存中,以便随后的write操作使用。
write ( 写入):作用于主内存的变量,它把store操作从工作内存中得到的变量的值放入主内存的变量中。
如果要把一个变量从主内存复制到工作内存,那就要顺序地执行read和load操作,如果要把变量从工作内存同步回主内存,就要顺序地执行store和write操作。这里很关键的一个点是,read与load之间、store与write之间是可插入其他指令的。课程里我们演示的count+1操作,每次执行count++操作时,对于一个线程而言,必须经过read从主存读取,然后再load到工作内存,再执行count=count+1时,先将更新后的值经过store传到主内存,然后执行write操作将值写入主内存,这样解释,你应该能更清楚各个操作的含义,也能更清楚线程不安全的发生。