volatile关键字

volatile语义

  1. 保证了不同线程间的可见性
  2. 禁止指令重排序,保证了有序性
  3. 并不能保证原子性

volatile如何保证内存可见性

是通过内存屏障和禁止指令重排序来保证内存可见性的

验证volatile

public class VolatileTest {
     

  private static /*volatile*/ int INIT_VALUE = 0;
  private static int MAX_LIMIT = 5;

  public static void main(String[] args) {
     
    new Thread(
            () -> {
     
              int local = INIT_VALUE;
              while (local < MAX_LIMIT) {
     
                if (local != INIT_VALUE) {
     
                  System.out.printf("the local update to [%d] \n", INIT_VALUE);
                  local = INIT_VALUE;
                }
              }
            },
            "reader")
        .start();
    new Thread(
            () -> {
     
              int local = INIT_VALUE;
              while (INIT_VALUE < MAX_LIMIT) {
     
                System.out.printf("update value to [%d] \n", ++local);
                INIT_VALUE = local;
                try {
     
                  Thread.sleep(500);
                } catch (InterruptedException e) {
     
                  e.printStackTrace();
                }
              }
            },
            "updater")
        .start();
  }
}
INIT_VALUE如果不用volatile进行修饰,得到的结果如下:
update value to [1] 
update value to [2] 
update value to [3] 
update value to [4] 
update value to [5] 
INIT_VALUE用volatile进行修饰,得到的结果如下:
update value to [1] 
the local update to [1] 
update value to [2] 
the local update to [2] 
update value to [3] 
the local update to [3] 
update value to [4] 
the local update to [4] 
update value to [5] 
the local update to [5] 

volatile关键字_第1张图片

使用volatile需要满足以下条件

  1. 当你能确保只有单个线程更新变量的值。
  2. 该变量没有其他线程引用为final

你可能感兴趣的:(多线程)