一、主内存和工作内存 变量是指实例字段、静态字段、构成数组的对象,不包括局部变量和方法参数
- 所有变量都存储在主内存中
- 线程工作内存保存了被该线程使用到的变量的副本
- 对变量所有的操作都是在工作内存进行,不能直接读写主内存的变量
- 线程间变量值的传递都要依赖主内存来完成
二、主内存和工作内存间的交互操作
- 一个变量从主内存拷贝到工作内存,再由工作内容写到主内存,是有Java的8种操作来完成的
(1)lock
(2)unlock unlock之前必须先把此变量同步到主内存\ (3)read
(4)load
(5)use
(6)assign
(7)store
(8)read
三、volatile
- 保证可见性 volatile特殊规则保证新值能立即同步到主内存,以及使用前立即从主内存刷新
- 防止指令重排序
- 不保证原子性
四、先行发生原则(无需任何同步手段, )
- 程序次序规则: 在一个线程内,按照代码顺序,书写前面的操作先于后面的操作
int i=1;
int j=1;
有可能j=1先被执行,这不影响先行发生原则的正确性
- 管程锁定规则:同一把锁unlock在lock之前执行
- volatile变量规则:写先于读
- 线程启动规则:thread.start()先行于线程每一个动作。
- 线程终止规则:所有操作先于线程的终止检测
- 线程中断规则:interrupt()先行于中断线程的检测到中断发生
- 对象终止规则:初始化完成先于finalize开始之前
- 传递性:如果操作A先于B,B先于C,那A就先于C