发布一个没有持有用于发布的锁的构造的@NotThreadSafe实例是否安全?

时间:2012-12-09 14:35:37

标签: java concurrency thread-safety

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

鉴于课程:

@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而拿着锁是一个不安全的出版物?

1 个答案:

答案 0 :(得分:3)

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