【发布时间】:2022-03-24 17:51:30
【问题描述】:
我正在学习同步方法,以防止 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;
}
}
无论微妙与否,我认为我对同步方法的作用存在根本性的误解。我的印象是他们通过使用锁定令牌(或类似的)来限制对线程的访问,因此永远不能竞争。那么,如果它的方法是同步的,这个例子怎么会有竞争条件呢?谁能帮忙澄清一下?
【问题讨论】:
-
我总是很想对这样的问题盲目地回答“是”(仅基于标题)。
标签: java multithreading race-condition