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(); } }