【问题标题】:Java Concurrent API's Lock not working as intended [duplicate]Java并发API的锁没有按预期工作[重复]
【发布时间】:2021-08-09 15:57:59
【问题描述】:

我正在尝试使用 Java Concurrent 的锁 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
    }
}

不知道我在这里做错了什么。

【问题讨论】:

  • "// 10000" 注意正确的结果是10001,因为你使用了&lt;=10000
  • @AndyTurner,是的,你是对的。答案应该是 10001

标签: java multithreading java.util.concurrent


【解决方案1】:

您无需等待所有线程完成。 executor.shutdown() 只是停止 executor 接受新工作。

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

Ideone demo

此外,您应该使用锁定/解锁对围绕demoClass.count 的读取,以便在线程中对变量的写入和读取之间建立发生前的关系。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-15
    • 2014-12-17
    • 2012-11-01
    • 2011-12-01
    • 1970-01-01
    • 2011-11-11
    • 2013-02-11
    • 2021-08-14
    相关资源
    最近更新 更多