本文主要介绍Java使用volatile关键字变量,在多线程中并发中示例代码,出现在并发情况下,这个a == 1 && a == 2 && a == 3是true。

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