确保变量仅设置一次

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同时调用该方法(完全相同的时间)时,不可能无法购买该文章吗?

Boh*_*ian 5

只要buyer无法通过非同步方法设置,您的代码就是线程安全的.

JVM将确保同步方法永远不会发生"完全相同的时间" - 一个呼叫者将被视为第一个呼叫者,另一个呼叫者必须等到第一个呼叫完成后再继续.