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 に答える