《Java并发编程实践》的注解中有提到这一概念。

为了保证SafePoint的多线程安全性,在使用另一个实例构造新的实例时,使用了一个私有的构造器。

首先为什么不用下面这种,还是为了避免竞态(p.x和p.y调用不是原子操作)。

同理,这种也不行,两次调用get()方法不是原子操作。

为什么接受数组为参数的构造器不能公开,数组a是有外部传入的,并不能保证数组内容不会其他线程修改。

当然我们可以使用下面这种代替私有的构造器,这种方法是安全的,但是会产生重复的初始化代码。

再回头看SafePoint的线程安全性,SafePoint有两个状态变量x、y。为了保证线程安全性,没有为其分别提供getter和setter方法,而是将其封装后发布并使用内置锁保护。