volatile是怎么保证可见性的

volatile可见性:是指当多个线程并发访问共享变量时,一个线程对共享变量的修改,其它线程能够立即看到。
那么volatile是如何保证可见性的,首先我们来简单看一下Java内存模型图:

 volatile是怎么保证可见性的_第1张图片

假设有一个变量 static int vlt = 0; 
那么首先在主内存中会一个vlt变量;同时在线程1和线程的2的线程内都有一个vlt 的副本,目的是为了提高执行效率,变量随线程结束消失。
如果此时线程1执行vlt=5;那么此时线程2读到的变量会是什么?
 有可能是1也有能能是5,具体需要看线下2什么时候同步了住内存的变量.。
那加上 volatile static int vlt = 0;是如何保证2线程是读到的一定是5呢?
 volatile 主要是利用了java的先行发生原则 (简单介绍先行发生原则:
      在计算机科学中,先行发生原则是两个事件的结果之间的关系,如果一个事件发生在另一个事件之前,结果必须反映,即使          这些事件实际上是乱序执行的(通常是优化程序流程)。
     )
volatile相关的规则:
 对于一个volatile变量的写操作先行发生于后面对这个变量的读操作。
 因此当线程1执行了vlt=5;写操作是必然先发生2线程读操作。即线程2从主内存读到的数据一定是线程1写过的数据那就是5。所以volatile主要利用了先行发生原则保证线程之间的可见性。

你可能感兴趣的:(java基础)