public class Singleton {
/**
* 类级的内部类,也就是静态的成员式内部类,该内部类的实例与外部类的实例
* 没有绑定关系,而且只有被调用到才会装载,从而实现了延迟加载
*/
private static class SingletonHolder{
/**
* 静态初始化器,由JVM来保证线程安全
*/
private static Singleton instance = new Singleton();
}
/**
* 私有化构造方法
*/
private Singleton(){
}
public static Singleton getInstance(){
return SingletonHolder.instance;
}
}
/**
* 类级的内部类,也就是静态的成员式内部类,该内部类的实例与外部类的实例
* 没有绑定关系,而且只有被调用到才会装载,从而实现了延迟加载
*/
private static class SingletonHolder{
/**
* 静态初始化器,由JVM来保证线程安全
*/
private static Singleton instance = new Singleton();
}
/**
* 私有化构造方法
*/
private Singleton(){
}
public static Singleton getInstance(){
return SingletonHolder.instance;
}
}
高人写的
如果用第三种,建议声明为final的,因为我们没有理由不将其声明为final的。另外,关于双重锁定,建议你看看EhCache的源代码里的CacheManager类,new了新的实力后,应该在synchronized块内return,其余一致,包括将实例声明为原子的。
附EhCache项目CacheManager部分源代码:
- public static CacheManager create() throws CacheException {
- if (singleton != null) {
- return singleton;
- }
- synchronized (CacheManager.class) {
- if (singleton == null) {
- LOG.debug("Creating new CacheManager with default config");
- singleton = new CacheManager();
- } else {
- LOG.debug("Attempting to create an existing singleton. Existing singleton returned.");
- }
- return singleton; // 这里是在synchronized块内返回的,而你的例子不是
- }
- }
原文:http://cantellow.iteye.com/blog/838473#comments