volatile 线程可见性

说起volatile, 经常听到的一句话就是使用了该关键字修饰的变量在线程中可见.

那么为什么不使用volatile的变量在线程中不可见?

 首先来一段代码演示:

volatile 线程可见性_第1张图片

代码中bo设置了false了还一直在循环中.是为什么?

这得从java内存模型中说起.

JAVA内在模型及操作规范

  1. 共享变量必须存放在主内存中.

  2. 线程有自己的工作内存,而且只可操作自己的工作内存

  3. 线程要操作共享变量,需从主内存中读取到工作内存,改变值后需从工作内存中同步到主内存中

volatile 线程可见性_第2张图片

当线程2对共享变量bo改变后还没有来得及写入主存当中,线程2转去做其它的事了,那么线程1不知道线程2对bo变量的更改,线程1读取的是自己工作内存中的bo变量

 是主内存和线程中的工作内存的同步问题.

下面我们来加上volatile关键字:

volatile 线程可见性_第3张图片

如图加上volatile关键字后很快执行完.并输出i的值.

第一.使用volatile关键字会强制将修改的值立即写入主存.

第二.使用volatile关键字的话,当线程2进行修改时,会导致线程1的工作内存中缓存变量bo的缓存行无效.当线程1再次读取变量bo的值时发现自己的缓存行无效,它会等待主存地址被更新之后,然后去对应的主存读取最新的值.

请注意,volatile保存可见性,不保存原子性.

你可能感兴趣的:(java)