Java volatile关键字未按预期工作

Pra*_*and 3 java multithreading

我正在学习易变量.我知道volatile的作用,我为Volatile变量编写了一个示例程序,但没有按预期工作.

为什么"计数"的最终值有时会低于2000.我使用了volatile,因此系统不应该缓存"count"变量,值应该始终为2000.

当我使用synchronized方法时它工作正常但不是volatile关键字.

public class Worker {

private volatile int count = 0;
private int limit = 10000;

public static void main(String[] args) {
    Worker worker = new Worker();
    worker.doWork();
}

public void doWork() {
    Thread thread1 = new Thread(new Runnable() {
        public void run() {
            for (int i = 0; i < limit; i++) {

                    count++;

            }
        }
    });
    thread1.start();
    Thread thread2 = new Thread(new Runnable() {
        public void run() {
            for (int i = 0; i < limit; i++) {

                    count++;

            }
        }
    });
    thread2.start();

    try {
        thread1.join();
        thread2.join();
    } catch (InterruptedException ignored) {}
    System.out.println("Count is: " + count);
}
}
Run Code Online (Sandbox Code Playgroud)

先感谢您 !

Dav*_*rtz 10

当你这样做时count++,这是一个读取,一个增量,然后是一个写入.两个线程可以各自执行读取操作,每个线程都执行增量操作,然后每个线程执行写入操作,只产生一个增量.虽然您的读取是原子的,但您的写入是原子的,并且没有缓存任何值,这还不够.您需要的不仅仅是 - 您需要一个原子读 - 修改 - 写操作,volatile并不提供.