可见性分析
导致共享变量在线程间不可见的原因:
线程的交叉执行
重排序结合线程交叉执行
共享变量未及时更新
synchronized实现可见性代码:在读、写操作的方法上加上synchronized(对应上面出现问题的解决方案)
原子性
原子性
可见性
可见性分析
导致共享变量在线程间不可见的原因
可见性分析
导致共享遍历在线程中不可见的原因:
线程交叉执行
指令重排序结合线程交叉执行
共享遍历在更新后没有及时更新到主内存中
synchronized实现可见性原因
可见性分析
synchronized 实现内存可见性的解决方案:
1、添加了synchronized 的地方相当于加了一把锁,被添加锁的地方,在一定时间内只能当前线程释放锁,其他线程才有机会进入其中执行代码;
2、synchronized 使得 同步的情况下,共享变量在被第二次调用前便被同步到了主内存,实现了共享变量的即时更新
synchronized 实现可见性 的
安全代码:
导致共享变量在线程间不可见的原因
进行重排序
执行结果:result的值为0
没有进行重排序
执行结果:result的值为3
synchronized实现可见性。
导致共享变量在线程间不可见的原因。
代码不加同步的情况下,共享变量在线程间不可见的原因:
线程的交叉执行
指令重排序,同时线程间交叉执行
线程对共享变量进行更新后,没有在工作内存与主内存间及时更新
可见性分析及synchronized解决方案
为啥synchronized原子性可以避免线程交叉执行:因为synchronized加锁在对象上,执行read方法的线程1获得了对象锁,那线程2不能获得对象锁也就不能执行write方法,因为要执行write方法需要获得锁。但是线程1可以继续执行write方法,因为write方法和read方法可以使用同一把锁,synchronized锁可以重入
共享变量不可见原因
可见性分析
读操作进行重排序后的结果
进行代码重排序
执行结果result的值为0
没有进行重排序
执行结果:result的值为3
鹅鹅鹅饿饿
的顶顶顶顶顶
啊啊啊啊啊啊啊啊啊啊啊
synchronized 解决线程不安全问题
导致共享变量在线程之间不可见的原因
可见性分析及synchronized解决方案
为啥synchronized原子性可以避免线程交叉执行:因为synchronized加锁在对象上,执行read方法的线程1获得了对象锁,那线程2不能获得对象锁也就不能执行write方法,因为要执行write方法需要获得锁。但是线程1可以继续执行write方法,因为write方法和read方法可以使用同一把锁,synchronized锁可以重入
共享变量在线程间不可见的原因