确保变量仅设置一次

时间:2014-01-16 13:57:12

标签: 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;
}

这是否是线程安全的,我可以假设在同时(完全相同的时间)调用buy方法时无法购买文章吗?

4 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:2)

您的方法同步的事实确实使其安全 - 只要这是您更新买家的唯一方式。

答案 2 :(得分:2)

是的,这很好(当然,除非您从其他方法访问买方字段)。

尝试同时执行此方法的两个线程将无法执行此操作:只有一个线程可以获取锁定并初始化买方。然后另一个线程将执行它,并在方法同步后看到初始化的买方。

答案 3 :(得分:0)

你可以拥有

this.buyer

易变变量