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             

 

posted @ 2021-03-17 11:39  lvlin241  阅读(55)  评论(0编辑  收藏  举报