java - 多线程私有(private)构造函数

标签 java multithreading constructor

直接来自 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 个问题。 为什么?

  1. private SafePoint(int[] a)
  2. 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/

相关文章:

c# - 线程执行顺序

java - 如何在 Java Singleton 枚举构造函数中调用方法?

java - 在主方法中调用类的构造函数?

java - 空指针异常 | `this` 内部枚举构造函数导致 NPE

java - 按数值递增字母字符

java - 登录: How to separate logs for each "user" in a web application?

java - 如何在独立应用程序中关闭 Ehcache CacheManager

java - 正在绘制的盒内盒的数量为 N

python - 在给定的时间后终止功能?

c - 实现用户级线程包