java的volatile

what:

  volatile 是 Java 中的关键字,是一个变量修饰符,被用来修饰会被不同线程访问和修改的变量

 

why:

  1、可见行:

    多个线程访问同一个变量时,其中一个线程修改了该变量的值,其它线程能够立即看到修改的值。

    在 Java 内存模型中,所有的变量都存储在主存中,同时每个线程都拥有自己工作内存,用于提高访问速度。线程会从主存拷贝变量值到自己的工作内存中,然后在自己的工作线程中操作变量,而不是直接操作主存中的变量,由于每个线程在自己的内存中都有一个变量的拷贝,就会造成变量值不一致的问题。

    how:使用 volatile 修饰的变量确保了线程不会将该变量拷贝到自己的工作线程中。

 

  2、原子性:

    volatile 只保证单次读/写操作的原子性,对于多步操作,volatile 不能保证原子性。

    例如:“count++” 是一个复合操作,包括三个部分:读取 count 的值;对 count 加 1;将 count 的值写回内存;  volatile 对于这三步操作是无法保证原子性的,所以vloatile 并不能解决所有同步的问题。

 

  3、有序性:

    在 Java 内存模型中,允许编译器和处理器对指令进行重排序,重排序过程不会影响单线程程序的执行,但是会影响多线程并发执行的正确性。volatile 关键字可以禁止指令重新排序,可以保证一定的有序性。

    有序性有两层含义:

      a、所有在 volatile 修饰的变量操作之前操作,将会对随后该 volatile 修饰的变量操作之后的语句可见

      b、禁止 JVM 重排序:volatile 修饰的变量的读写指令不能和其前后的任何指令重排序,其前后的指令可能会被重排序。   

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2022-04-25 19:18  修心而结网  阅读(124)  评论(0编辑  收藏  举报