我需要确保一件商品只卖一次。 这也必须通过多个线程来确保。
检查buyer
变量是否为空是否足够?所以在我看来,第二个来电者会收到AlreadyBoughtException
?
public synchronized void buy(Buyer buyer) throws AlreadyBoughtException {
if (this.buyer != null) {
throw new AlreadyBoughtException();
}
System.out.println(buyer + " bought article " + identifier);
this.buyer = buyer;
this.sold = true;
}
这是否是线程安全的,我可以假设在同时(完全相同的时间)调用buy
方法时无法购买文章吗?
答案 0 :(得分:5)
只要buyer
无法通过非同步方法设置,您的代码就是线程安全的。
JVM将确保同步方法永远不会发生“完全相同的时间” - 一个呼叫者将被视为第一个呼叫者,另一个呼叫者必须等到第一个呼叫完成后再继续。
答案 1 :(得分:2)
您的方法同步的事实确实使其安全 - 只要这是您更新买家的唯一方式。
答案 2 :(得分:2)
是的,这很好(当然,除非您从其他方法访问买方字段)。
尝试同时执行此方法的两个线程将无法执行此操作:只有一个线程可以获取锁定并初始化买方。然后另一个线程将执行它,并在方法同步后看到初始化的买方。
答案 3 :(得分:0)
你可以拥有
this.buyer
易变变量