引用: Java内存模型
java内存模型
线程栈:本地变量,
堆:对象,对象成员变量,静态成员变量
如果两个线程同时调用同一个对象的同一个方法,她们将会都访问这个对象的成员变量,但是每一个线程都拥有这个本地变量的私有拷贝。
java内存模型和硬件内存架构之间存在差异。硬件内存架构没有区分线程栈和堆。对于硬件,所有的线程栈和堆都
分部在主内存中,部分线程和堆可能存在cpu缓存中和cpu内部的寄存器中。当对象和变量被存放在计算机中各种不同的内存区域的时候,就可能
出现如下两个方面问题:
1,线程对共享变量修改的可见性:多个线程在没有正确使用volatile声明或者同步的情况下共享一个对象,一个线程更新这个共享对象
可能对其他线程来说是不可见的。
解决方法:volatile关键字
保证直接从主存中读取一个变量,如果这个变量被修改后,总是会被写回到主存中去。
2,当读,写和检查共享变量时出现race conditions:多个线程在共享变量上更新变量
解决方法: 使用java同步块。一个同步块可以保证在同一时刻仅有一个线程进入
代码临界区。同步块还可以保证代码块中的所有被访问的变量将会从主存中读入,当线程退出代码块时候,所有被更新的变量都会被
刷新回主存,不管这个变量是否被声明为volatile
网友评论