gpt4 book ai didi

java - 线程同步问题(更新变量 sum)

转载 作者:行者123 更新时间:2023-11-30 02:02:23 25 4
gpt4 key购买 nike

当我想使用同步关键字或锁进行更新时,当 sum 变量为 int 时它会起作用,但当它是 Integer 对象时则不起作用。

代码如下 -

public class TestSynchronized {
private Integer sum = new Integer(0);

public static void main(String[] args) {
TestSynchronized test = new TestSynchronized();
System.out.println("The sum is :" + test.sum);
}

public TestSynchronized() {
ExecutorService executor = Executors.newFixedThreadPool(1000);

for (int i = 0; i <=2000; i++) {
executor.execute(new SumTask());
}

executor.shutdown();

while(!executor.isTerminated()) {
}
}

class SumTask implements Runnable {
Lock lock = new ReentrantLock();

public void run() {
lock.lock();

int value = sum.intValue() + 1;
sum = new Integer(value);

lock.unlock(); // Release the lock
}

}
}

最佳答案

问题是您为每个 SumTask 对象都有单独的。这些对象应该共享

TestSynchronized()方法中创建一个lock对象。这应该由所有new SumTask(lock)对象共享。

所以你的 SumTask 类看起来像:

class SumTask implements Runnable {
Lock lock;

public SumTask(Lock commonLock) {
this.lock = commonLock;
}

public void run() {
lock.lock();

int value = sum.intValue() + 1;
sum = new Integer(value);

lock.unlock(); // Release the lock
}

}

并且不要忘记在 TestSynchronized() 方法中创建一个 commonLock 对象:

  Lock lock = new ReentrantLock();

executor.execute(new SumTask(commonLock));

关于java - 线程同步问题(更新变量 sum),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52418169/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com