singleton模式的一种变体:double-checked locking
2001-10-12 20:25
399 查看
singleton模式的一种变体:double-checked locking
在单线程下,我们的singleton多半是这样(java):
class Singleton{
private Singleton(){ //... };
private static Singleton instance = null;
public static Singleton getInstance
{
if ( instance == null )
instance = new Singleton();
return instance;
};
//...
}
但是在多线程环境下,这里有个问题:如果一个线程先检查了instance==null,然后开始创建新的实例;同时另一个线程又来检查instance==null(此时第一个线程的创建还没完成),然后也创建新的实例。这样就有了Singleton类的两个实例——我们的singleton模式失败了。
所以我们应该加入同步代码。但是加在哪里呢?如果每个线程都需要同步再获得实例引用,这必然会形成一个瓶颈;如果在instance==null的检查后面加同步代码……这根本没有用。为什么?自己想想吧。
我们应该怎么办?同步代码肯定应该在instance==null的后面,同时,在创建新对象之前应该再检查一次instance==null:
class Singleton{
//...
private synchronized static void doSync(){
//在这里同步
}
public Singleton getInstance(){
if(instance==null){
Singleton.doSync();
if(instance==null) // 再进行一次检查
instance = new Singleton();
}
return instance;
}
两次检查,既避免了效率瓶颈,又避免了重复创建。这就是double-checked locking模式。
在单线程下,我们的singleton多半是这样(java):
class Singleton{
private Singleton(){ //... };
private static Singleton instance = null;
public static Singleton getInstance
{
if ( instance == null )
instance = new Singleton();
return instance;
};
//...
}
但是在多线程环境下,这里有个问题:如果一个线程先检查了instance==null,然后开始创建新的实例;同时另一个线程又来检查instance==null(此时第一个线程的创建还没完成),然后也创建新的实例。这样就有了Singleton类的两个实例——我们的singleton模式失败了。
所以我们应该加入同步代码。但是加在哪里呢?如果每个线程都需要同步再获得实例引用,这必然会形成一个瓶颈;如果在instance==null的检查后面加同步代码……这根本没有用。为什么?自己想想吧。
我们应该怎么办?同步代码肯定应该在instance==null的后面,同时,在创建新对象之前应该再检查一次instance==null:
class Singleton{
//...
private synchronized static void doSync(){
//在这里同步
}
public Singleton getInstance(){
if(instance==null){
Singleton.doSync();
if(instance==null) // 再进行一次检查
instance = new Singleton();
}
return instance;
}
两次检查,既避免了效率瓶颈,又避免了重复创建。这就是double-checked locking模式。
相关文章推荐
- singleton模式的一种变体:double-checked locking
- Singleton 单件模式及其变体 Double-Checked Locking 双重检查锁模式
- Singleton 单件模式及其变体 Double-Checked Locking 双重检查锁模式
- (设计模式)Singleton和Double-Checked Locking模式
- Singleton - 单例模式和Double-Checked Locking - 双重检查锁定模式
- python 元类型编程, 单例模式SingleTon的一种实现方式
- 单例模式下的双重检验锁Double Checked Locking
- Design Pattern_Singleton(单件模式)和Double-Checked Locking(双重检查锁定)
- Singleton(单例)模式和Double-Checked Locking(双重检查锁定)模式
- Singleton设计模式的一种见解
- Singleton设计模式的一种见解
- [zt]Singleton和Double-Checked Locking设计模式—UML图及代码实现
- c++中的 单例模式(singleton)和双检测锁(Double-Checked Locking)
- 《设计模式解析》 第21章 Singleton 和 Double-checked模式
- singleton模式的double-check
- 单件模式(Singleton)的变体Meyers模式
- 设计模式学习笔记二——Singleton模式
- Java设计模式透析之 —— 单例(Singleton)
- 单件模式-Singleton
- double check for lock in the singleton