直接从实践中的Java并发:
@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;
}
}
以上是一个Thread-safe类:因为它的setter是同步的。 我也理解为什么getter不会单独返回x / y而是返回一个数组。 我有两个问题。 为什么?
private SafePoint(int[] a)
public SafePoint(SafePoint p) { this(p.get()); }
代替this(p.x,p.y);
答案 0 :(得分:9)
因为调用this(p.x, p.y)
不是原子的。换句话说,想象下面的线程交错:
read p.x
p.set(otherX, otherY);
read p.y
并致电this(p.x, p.y);
x和y现在来自两个不同的点,可能不一致。
另一方面,p.get()
原子地读取x和y(它是synchronized
),因此保证数组中的x和y来自同一点。