gpt4 book ai didi

java - 同步方法可以有竞争条件吗? [例子]

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:47:11 28 4
gpt4 key购买 nike

我正在学习同步方法,以防止 Java 中的竞争条件和不良行为。我看到了以下示例,并被告知竞争条件非常微妙:

public class Messages {
private String message = null;
private int count = 2;

// invariant 0 <= count && count <= 2

public synchronized void put(String message) {
while( count < 2 )
this.wait();
this.message = message;
this.count = 0;
this.notifyAll();
}

public synchronized String getMessage() {
while( this.count == 2 )
this.wait();
String result = this.message;
this.count += 1;
this.notifyAll();
return result;
}
}

无论是否微妙,我认为我对同步方法的作用存在根本性的误解。我的印象是他们通过使用锁定 token (或类似的)来限制对线程的访问,因此永远不会竞争。那么,如果它的方法是同步的,这个例子怎么会有竞争条件呢?谁能帮忙澄清一下?

最佳答案

我推测作者的想法是,由于计数从 0 到 2,两个线程可能依次调用 put(),因此读取线程会错过其中一个消息。

这确实是一个竞争条件:reader 和 putter 竞争同一个锁,是否正在读取消息取决于 notifyAll() 通知哪个线程。

关于java - 同步方法可以有竞争条件吗? [例子],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22923297/

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