volatile关键字理解
1. java 内存模型(JMM) <1> 模型
个人理解:
<1> 假设现在有3个线程t1、t2、t3,需要对主内存中的shareVar进行加1操作,JMM规范要求:这3个线程分别从主内存中拷贝一份shareVar到自己的工作空间中(即m1、m2、m3各存在一份),然后三个线程可以进行加1操作,然后每当一个线程完成了加1操作,就立即把其工作内存中的数据刷新到主内存中,并且通知其它线程更新其工作空间中的值;
<2> 特点:
可见性 : 共享数据在多个线程并发操作时,某个线程修改了共享数据,其它线程可以及时获取到更新通知;
原子性 : 共享数据在多个线程并发操作时,能获取到最新的、正确的值;
有序性 : 共享数据在多个线程并发操作时,不会因某些原因(如:指令重排等)导致共享数据结果出现不一致问题(典型例子:++操作)。
<3> 目前实现JMM规范的技术:synchronized、volatile(不满足原子性)
2. volatile (测试代码仓库:https://gitee.com/lvlin241/interview.git)
<1> 满足JMM的可见性和有序性; 示例代码: VolatileDemo.java ; VolatileDemoWithVolatile.java <2> 不满足原子性,解决方案见<3>; 示例代码:VolatileNotSafeDemo.java <3> 解决volatile不满足原子性的方案 a. 使用synchronized关键字 b. 使用JUC包下面的Atomic类(如AtomicInteger) ,解决++数据不一致问题 示例代码:VolatileSafeWithAtomicDemo.java