这是一本安全的出版物吗?
鉴于课程:
@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而拿着锁是一个不安全的出版物?
答案 0 :(得分:3)
这是一个非常有效的操作。 Pub将为null或正确初始化。这是因为初始化和赋值在同一个线程上相互发生。