2.懒汉模式的优化---加锁控制的单例模式(江湖人称double-checked-locking)
为了避免在多线程下创建多个实例的情况出现,我们需要进行锁控制。 代码如下:
/**
* double-checked-locking模式
* 将非必须的锁定优化掉,避免因为同步锁导致的大量等待时间
* 支持多线程环境
*/
public
这就是造成著名的双重检查锁定(double-checked-locking)问题的根源,其中对象引用在没有同步的情况下进行读操作,产生的问题是您可能会看到一个更新的引用,但是仍然会通过该引用看到不完全构造的对象
singleton = new Singleton_DCLPro(); } } } return singleton; } } 双检锁/双重校验锁(DCL,即 Double-Checked-Locking
int intcrement(){ return value++; //利用synchronized保证复合操作的原子性 } } DCL双端锁的发布(double-checked-locking
(这就是造成著名的双重检查锁定(double-checked-locking)问题的根源,其中对象引用在没有同步的情况下进行读操作,产生的问题是您可能会看到一个更新的引用,但是仍然会通过该引用看到不完全构造的对象
才会写到入到内当中当 cpu1 把消息设置会无效后,会把原来的数据 a = 1 放到一个 queue 队列当中,并且会发送一个消息通过已经置为无效图片使用场景一个线程写, 多个线程读状态标志(开关模式)双重检查锁定(double-checked-locking
这就是造成著名的双重检查锁定(double-checked-locking)问题的根源,其中对象引用在没有同步的情况下进行读操作,产生的问题是您可能会看到一个更新的引用,但是仍然会通过该引用看到不完全构造的对象
// double-checked-locking - don't do this!
这种场景在著名的双重检查锁定(double-checked-locking)中会出现: //注意volatile!
(这就是造成著名的双重检查锁定(double-checked-locking)问题的根源,其中对象引用在没有同步的情况下进行读操作,产生的问题是您可能会看到一个更新的引用,但是仍然会通过该引用看到不完全构造的对象