线程安全问题源头之一:可见性问题

为什么存在可见性问题, 因为提高性能。

   --cpu有缓存,高速缓存一样。一般热点数据就那么几个,而直接操作内存则速度比较慢。所有加入缓存把一些操作数缓存在高速缓存,下次使用直接读取。

 

问题探究:

1. 短时间内写操作不可见,  cpu高速缓存。由于cpu高速缓存的存在所有线程之间的共享变量会在线程内部有一个副本,会导致短时间内如果修改变量导致这个修改操作对于其他线程不可见。 

2. 长时间内部可见,指令重排序。比如可能将一些热点代码JIT重排序。导致判断失效而产生长时间或者永久写操作不可见。

 

解决:

volatile , 内部是硬件使用cpu总线失效方法解决的。

同步关键字, 其实是将热点代码变成非热点代码,解决指令JIT重拍问题。

 

posted @ 2020-02-03 11:48  小小zkj  阅读(176)  评论(0)    收藏  举报