为什么选择SafePoint threadSafe?(实际并发)

时间:2017-02-10 22:02:02

标签: java multithreading concurrency thread-safety safe-publication

我正在阅读实践中的并发性 有以下示例(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]);

我相信有几个可能的结果:

  1. 申请没有完成 如果申请完成,则其他
  2. 我们可以看到  a)0 0
     b)0 1
     c)1 0
     d)1 1
  3. 我是对的吗? 如果为true,为什么作者将类标记为线程安全? 我认为线程安全的类 - 可以在没有复杂分析的并发应用程序中使用。

    作者想说什么?

    同样在书中我读过以下注释:

      

    私有构造函数的存在是为了避免竞争条件   如果复制构造函数是这样实现的(p.x,p.y);这个   是一个私有构造函数捕获成语的例子(布洛赫和   Gafter,2005)。

    我也不清楚。

    为什么我们需要3个构造函数,其中一个是私有的?

    请澄清这些事情。

0 个答案:

没有答案