gpt4 book ai didi

java - 即使在同步后仍存在竞争条件

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:23:02 25 4
gpt4 key购买 nike

我正在尝试运行多个线程。我显然遇到了竞争条件并且能够按如下方式解决它:

final Data data = new Data();
for (int i = 0; i < numberOfThreads; i++) {
final Thread thread = new Thread(new Runnable() {
@Override
public void run() {
//using this sync block to stop the race condition
synchronized (data){
final int value = data.getValue();
data.setValue(value + 1);
}
}
});
thread.start();
}

但我不想在这个 block 上同步,而是想在数据类中处理它。所以我删除了上面的同步块(synchronized block),而是在 Data 类中同步了 get 和 set 方法,如下所示,但这仍然会导致竞争条件。为什么即使我已同步它们也会出现问题?

public class Data {

private int value;

public synchronized int getValue(){
return this.value;
}

public synchronized void setValue(int num){
this.value = num;
}
}

最佳答案

因为你没有。您同步了它们中的任何一个,因此两个线程不能同时执行这些方法,但是一个线程可以执行 getValue() 然后完成 getValue() 并且在它进入 setValue() 轮到另一个线程调用 getValue(),这是完全合法的,也是您的竞争条件。

顺便说一句。以防万一 Data 是你的整个类(class),AtomicInteger会是一样的,但做得好。你在那里。 G。有一个 incrementAndGet() 方法在一个 同步块(synchronized block)中执行读写操作,这是您案例中的关键点。

关于java - 即使在同步后仍存在竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36961433/

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