《Java并发编程实践》的注解中有提到这一概念。
为了保证SafePoint的多线程安全性,在使用另一个实例构造新的实例时,使用了一个私有的构造器。
首先为什么不用下面这种,还是为了避免竞态(p.x和p.y调用不是原子操作)。
同理,这种也不行,两次调用get()方法不是原子操作。
为什么接受数组为参数的构造器不能公开,数组a是有外部传入的,并不能保证数组内容不会其他线程修改。
当然我们可以使用下面这种代替私有的构造器,这种方法是安全的,但是会产生重复的初始化代码。
再回头看SafePoint的线程安全性,SafePoint有两个状态变量x、y。为了保证线程安全性,没有为其分别提供getter和setter方法,而是将其封装后发布并使用内置锁保护。