mhm*_*mpl 1 java exception thread-safety
我需要确保一件商品只卖一次.这也必须通过多个线程来确保.
是否足以检查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;
}
Run Code Online (Sandbox Code Playgroud)
这是否是线程安全的,我可以假设当buy同时调用该方法(完全相同的时间)时,不可能无法购买该文章吗?
只要buyer无法通过非同步方法设置,您的代码就是线程安全的.
JVM将确保同步方法永远不会发生"完全相同的时间" - 一个呼叫者将被视为第一个呼叫者,另一个呼叫者必须等到第一个呼叫完成后再继续.