2

这是一份安全的出版物吗?

给定班级:

@NotThreadSafe
public class Pub {
   int drinkers;
   public Pub(int drinkers) {
      this.drinkers = drinkers;
   }
}

T1 调用publish()和 T2 调用inspect

private final Object lock = new Object();

@GuardedBy("lock")
private Pub shared;

void publish() {
  Pub p = new Pub(12);
  synchronized(lock) {
      this.shared = p;  // publish  
  }
}

Pub inspect() {
  synchronized(lock) {
     return shared;
  }
}    

T2 能保证看到shared.drinkers == 12吗?还是我们在持有锁时没有构建Pub 的事实构成了不安全的发布?

4

1 回答 1

3

这是一个完全有效的操作。Pub 将为 null 或正确初始化。这是因为初始化和赋值是在同一个线程上相继发生的。

于 2012-12-09T14:49:42.627 回答