|
|
singleton模式的一种变体:double-checked locking |
|
|
作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站 |
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模式。 
|
|
相关文章:相关软件: |
|