これは安全な出版物ですか?
クラスを考えると:
@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 を構築しなかったという事実は、安全でないパブリケーションを構成するのでしょうか?