一文精通一文精通Java中的中的volatile关键字关键字
volatile是java中的关键词之一,这篇文章主要给大家介绍了关于Java中volatile关键字的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Java具有一定的参考学
习价值,需要的朋友们下面来一起学习学习吧
前言前言
在一些开源的框架的源码当中时不时都可以看到volatile这个关键字,最近特意学习一下volatile关键字的使用方法。
volatile 关键字:当多个线程进行操作共享数据时,可以保证内存中的数据可见。 相较于 synchronized 是一种较为轻量级的同步策略。
缺点:缺点:
1. volatile 不具备“互斥性”
2. volatile 不能保证变量的“原子性”
很多资料中是这样介绍volatile关键字的:
volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的“可见性”。可见性的意思是当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。
文字不太好理解,通过例子来理解。
1、例子、例子
首先看一个没有使用volatile关键字例子:
package com.swnote.java;
/**
* volatile测试例子
*
* @author lzj
* @date [2019-04-47]
*/
public class VolatileTest {
private boolean flag;
public static void main(String[] args) {
VolatileTest test = new VolatileTest();
test.test();
}
public void test() {
new Thread(() -> {
try {
Thread.sleep(1000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
flag = true;
}).start();
new Thread(() -> {
while (true) {
if (flag) {
System.out.println("thread flag = " + flag);
}
}
}).start();
}
}
该例子中定义了一个flag共享变量,test方法里面开启了两个线程,第一个线程在等待1秒中后修改共享变量flag的值为true,第二个线程通过循环判断flag的值,当flag的值为true时,输出内容。
此时有两种猜想:
执行后,可以看到输出内容,即说明第二个线程能够感知到第一个线程对共享变量flag的修改
执行后,没有任务内容,即说明第二个线程无法感知到第一个线程对共享变量flag的修改
然后执行结果为:
没有任务的输出内容,即证明了此时这样情况下第二个线程无法感知到第一个线程对共享变量flag的修改的
现在修改一下例子,即为flag变量加上volatile关键字,即:
private volatile boolean flag;
然后再运行,此时结果为:
此时就有内容输出了,说明加上volatile关键字后,第二个线程可以感知到第一个线程对共享变量flag的修改的,这就是上面概念中所说的volatile在多处理器开发中保证了共享变量的“可见性”。
2、原理、原理
通过上面的例子证明了volatile在多处理器开发中保证了共享变量的“可见性”,那它是怎么实现的呢?
这时就得介绍一下Java的内存模型了,首先看如下示意图:
评论0
最新资源