单例模式-研磨设计模式--单例模式--双重检查加锁(一)
2014-02-25 10:09
246 查看
* 双重检查加锁:
* “双重检查加锁“的方式可以既实现线程安全,又能够使性能不受到很大的影响。
* 那么什么是”双重检查加锁“机制呢?
* 所谓双重检查加锁机制,指的是:并不是每次进入getInstance方法都需要同步,
* 而是先不同步,进入方法过后,先检查实例是否存在,如果不存在才进入下面的同步块,
* 这是第一重检查。进入同步块后,再次检查实例是否存在,如果不存在,就在同步的
* 情况下创建一个实例,这是第二重检查。这样一来,就只需要同步一次了,从而减少了
* 多次在同步情况下进行判断所浪费的时间。
* 双重检查加锁机制的实现会使用一个关键字volatile,它的意思是:被volatile
* 修饰的变量的值,将不会被本地线程缓存,所有对该变量的读写都是直接操作共享内存,从而
* 确保多个线程能正确的处理该变量。
*
*说明:由于volatile关键字可能会屏蔽掉虚拟机中的一些必要的代码优化,所以运行效率并不是
*很高。因此一般建议,没有特别的需要,不要使用。也就是说,虽然可以使用”双重检查加锁“
* 机制来实现线程安全的单例,但并不建议大量采用,可以根据情况来选用。
public class Singleton_volatile {
private volatile static Singleton_volatileinstance=null;
private Singleton_volatile(){
}
public static Singleton_volatilegetInstance(){
//先检查实例是否存在,如果不存在才进入下面的同步块
if(instance==null){
//同步块,线程安全的创建实例
synchronized(Singleton_volatile.class){
//再次检查实例是否存在,如果不存在才真正的创建实例
if(instance==null){
instance=newSingleton_volatile();
}
}
}
return instance;
}
}
* “双重检查加锁“的方式可以既实现线程安全,又能够使性能不受到很大的影响。
* 那么什么是”双重检查加锁“机制呢?
* 所谓双重检查加锁机制,指的是:并不是每次进入getInstance方法都需要同步,
* 而是先不同步,进入方法过后,先检查实例是否存在,如果不存在才进入下面的同步块,
* 这是第一重检查。进入同步块后,再次检查实例是否存在,如果不存在,就在同步的
* 情况下创建一个实例,这是第二重检查。这样一来,就只需要同步一次了,从而减少了
* 多次在同步情况下进行判断所浪费的时间。
* 双重检查加锁机制的实现会使用一个关键字volatile,它的意思是:被volatile
* 修饰的变量的值,将不会被本地线程缓存,所有对该变量的读写都是直接操作共享内存,从而
* 确保多个线程能正确的处理该变量。
*
*说明:由于volatile关键字可能会屏蔽掉虚拟机中的一些必要的代码优化,所以运行效率并不是
*很高。因此一般建议,没有特别的需要,不要使用。也就是说,虽然可以使用”双重检查加锁“
* 机制来实现线程安全的单例,但并不建议大量采用,可以根据情况来选用。
public class Singleton_volatile {
private volatile static Singleton_volatileinstance=null;
private Singleton_volatile(){
}
public static Singleton_volatilegetInstance(){
//先检查实例是否存在,如果不存在才进入下面的同步块
if(instance==null){
//同步块,线程安全的创建实例
synchronized(Singleton_volatile.class){
//再次检查实例是否存在,如果不存在才真正的创建实例
if(instance==null){
instance=newSingleton_volatile();
}
}
}
return instance;
}
}
相关文章推荐
- 研磨设计模式--单例模式--双重检查加锁
- 设计模式学习—单例模式(双重检查锁之无序写入)
- (GOF23设计模式)_单例模式_双重检查锁式_静态内部类式_枚举式
- (设计模式)双重检查的缺陷以及更好的单例模式-java
- 03_ 单例设计模式_双重检查锁定
- 设计模式(01) 单例模式(创建类模式)(下,懒汉模式和双重检查锁)
- Java设计模式之单例模式 double---checked----locking双重检查锁定
- PHP设计模式——适配器模式(研磨设计模式学习笔记)
- 研磨设计模式之简单工厂模式(模式讲解)
- 研磨设计模式之 工厂方法模式-2
- 研磨设计模式之工厂方法模式-2——跟着cc学设计系列
- 研磨设计模式之 桥接模式-3
- 研磨设计模式之 策略模式-2
- 【Java学习笔记】线程安全的单例模式及双重检查锁—个人理解
- 研磨设计模式之单例模式-3
- 关于单例设计模式中的双重判断的理解和分析
- 双重检查模式单例续(DCL的代替方案)
- 研磨设计模式 之 装饰模式(Decorator)2
- 单例设计模式(懒汉式,饿汉式,枚举式,双重检测锁式,静态内部类式)
- 研磨设计模式 之 备忘录模式(Memento)1??跟着cc学设计系列