以前看到过这种写法,但是不知道为什么这么写:
public class Singleton
{
private static class SingletonHolder
{
public final static Singleton instance = new Singleton();
}
public static Singleton getInstance()
{
return SingletonHolder.instance;
}
}
今天在Spring in action 这本书上看到这个写法是initialization on demand holder模式,所以深入了解了下,感觉学习真的是无止尽。对于单例模式的认识也有一个渐进的过程。
一开始的时候,对于单例模式的认识仅限于饥饿模式和饱汉模式。
后来,引入了多线程,原来的写法就不够用了,然后就对整个方法加同步锁。
public class Singleton
{
private static Singleton singleton= null;
public static Synchronized Singleton getInstance()
{
if(singleton== null){
singleton = new Singleton();
}
return singleton;
}
}
但是上面的方法同步了整个方法块,导致性能不高,然后引入双重加锁机制。
public final class DoubleCheckedSingleton
{
private static DoubleCheckedSingletonsingObj = null;
private DoubleCheckedSingleton(){
}
public static DoubleCheckedSingleton getSingleInstance(){
if(null == singObj ) {
Synchronized(DoubleCheckedSingleton.class){
if(null == singObj)
singObj = new DoubleCheckedSingleton();
}
}
return singObj;
}
}
但是上面的方式还是存在一个问题,就是singObj正在初始化的时候,singObj已经不为空了,但是还没有完全初始化好,所以有可能返回一个不完整的对象。
最后还是使用initialization on demand holder模式好点。代码整洁干净,没有任何显式同步的痕迹。
参考链接