1、volatile使用说明
volatile
让变量每次在使用的时候,都从主存中取。而不是从各个线程的“工作内存”。volatile
具有synchronized
关键字的“可见性”,但是没有synchronized
关键字的“并发正确性”,也就是说不保证线程执行的有序性。
也就是说,volatile
变量对于每次使用,线程都能得到当前volatile
变量的最新值。但是volatile
变量并不保证并发的正确性。
2、volatile关键字多线程并发实例
一个线程不断地将变量a从1更改为3,另一个线程不断地测试a == 1 && a == 2 && a == 3
。在控制台上打印出连续的"Success",这种情况经常发生,代码如下:
public class VolatileRace {
private volatile int a;
public void start() {
new Thread(this::test).start();
new Thread(this::change).start();
}
public void test() {
while (true) {
if (a == 1 && a == 2 && a == 3) {
System.out.println("Success");
}
}
}
public void change() {
while (true) {
for (int i = 1; i < 4; i++) {
a = i;
}
}
}
public static void main(String[] args) {
new VolatileRace().start();
}
}