Java 并发 API 的锁未按预期工作

Java Concurrent API's Lock not working as intended

我正在尝试使用 Java 并发锁 API 同步 2 个线程。该代码基本上使用 2 个线程将计数器递增到某个数字,但即使在使用锁后我得到的结果也小于所述数字。 代码-

import java.util.concurrent.*;
import java.util.concurrent.locks.ReentrantLock;

class DemoClass {
    public int count =0;
    public ReentrantLock lock = new ReentrantLock();
    public void increment() {
        lock.lock();
        try {
            count++;
        } finally {
            lock.unlock();
        }
    }
}


public class Main {

    public static void main(String[] args)  {
        ExecutorService executor = Executors.newFixedThreadPool(2);
        DemoClass demoClass = new DemoClass();
        int i=0;
        for(;i<=10000;i++) {
            executor.submit(demoClass::increment);
        }

        executor.shutdown();

        System.out.println( demoClass.count);  // 10000
    }
}

不知道我做错了什么。

您没有等待所有线程完成。 executor.shutdown() 刚刚停止 executor 接受新工作。

您需要在 executor.shutdown(); 之后使用 executor.awaitTermination(...)

Ideone demo

此外,您应该用 lock/unlock 对包围 demoClass.count 的读取,以便在线程中对变量的写入和读取之间建立 happens-before 关系。