1 Volatile关键字正确使用demo
1 如果flag没有volatile关键字,则main中的while循环将无法正常推出循环
2 如果不使用volatile关键字,而在while循环方法中使用synchronized同步锁,也可刷新缓存,也能正常推出循环,但是多线程操作下效率就会变得很低了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 /**
* volatile关键字
* 1 线程之间可见性
* 2 不保证操作的原子性
*/
public class TestVolatile {
public static void main(String[] args) {
ThreadDemo threadDemo = new ThreadDemo();
new Thread(threadDemo).start();
while (true) {
if (threadDemo.isFlag()) {
System.out.println("flag变更为true,结束循环");
break;
}
}
}
}
class ThreadDemo implements Runnable {
private volatile boolean flag = false;
public void run() {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
flag = true;
System.out.println("flag变更为true");
}
public boolean isFlag() {
return flag;
}
}
2 Volatile内存可见性
1 内存可见性定义:当某个线程正在使用对象状态而另一个线程在同时修改该状态,需要确保当一个线程修改了对象状态后,其他线程能够立即看到发生的状态变化。
2 JVM内存模型:主内存和线程独立的工作内存。每个线程会在自己的工作内存来操作共享变量,操作的只是工作内存中的副本,其它线程也有一份副本,是互不可见的。而volatile关键字可以理解为所有线程读取和操作的都是主内存,所以是可见的。