我正在阅读实践中的并发性 有以下示例(4.3.5):
@ThreadSafe
public class SafePoint {
@GuardedBy("this") private int x, y;
private SafePoint(int[] a) { this(a[0], a[1]); }
public SafePoint(SafePoint p) { this(p.get()); }
public SafePoint(int x, int y) {
this.x = x;
this.y = y;
}
public synchronized int[] get() { return new int[] { x, y };
}
public synchronized void set(int x, int y) { this.x = x;
this.y = y;
}
}
作者表示SafePoint
- 线程安全 - 我不明白为什么。在此之前我没有看到发生这种情况。构造函数终止后,另一个线程可以看到SafePoint
实例未构建。
示例:
SafePoint racePublishedSafePoint; //field
//thread 1:
racePublishedSafePoint = new SafePoint(1,1);
//thread 2:
SafePoint sp;
while(true){
SafePoint sp = racePublishedSafePoint;
if(sp != null) break;
}
System.out.println(sp.get()[0]);
System.out.println(sp.get()[1]);
我相信有几个可能的结果:
我是对的吗? 如果为true,为什么作者将类标记为线程安全? 我认为线程安全的类 - 可以在没有复杂分析的并发应用程序中使用。
作者想说什么?
同样在书中我读过以下注释:
私有构造函数的存在是为了避免竞争条件 如果复制构造函数是这样实现的(p.x,p.y);这个 是一个私有构造函数捕获成语的例子(布洛赫和 Gafter,2005)。
我也不清楚。
为什么我们需要3个构造函数,其中一个是私有的?
请澄清这些事情。