直接来自 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;
}
}
上面是一个线程安全的类:因为它的 setter 是同步的。 我也理解为什么 getter 不单独返回 x/y 而是返回一个数组。 我有 2 个问题。 为什么?
private SafePoint(int[] a)
public SafePoint(SafePoint p) { this(p.get()); }
而不是this(p.x,p.y);
最佳答案
因为调用 this(p.x, p.y)
不是原子的。换句话说,想象一下以下线程交错:
- 线程 1:
读取 p.x
- 线程 2:
p.set(otherX, otherY);
- 线程 1:
读取 p.y
并调用this(p.x, p.y);
x 和 y 现在来自两个不同的点,可能不一致。
另一方面,p.get()
以原子方式读取 x 和 y(它是 同步的
),因此保证数组中的 x 和 y 是从同一个点。
关于java - 多线程私有(private)构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13970003/