以下包含三种单例模式的实现。
1 HungrySingleton(饿汉式)
2 LazySingleton1(懒汉式:方法级锁)
3 LazySingleton2(懒汉式:双检查锁 有BUG)
其中第三种在有的JAVA平台内存模型中,可能会出现BUG,不推荐使用
参考文章 双重检查锁定及单例模式 Peter Haggar
package singletonPattern;
/**
* describe: 饿汉式单例模式:JVM 加载该类时,即生成该类的实例,以后有getInstance方法被调用时,
* 即返回加载时生成的对象 hs
* 优点: 不会因为多线程环境下,生成多个HungrySingleton对象
* 没有锁的限制,返回hs速度较快
* 缺点: 无论程序需不需要HungrySingleton对象,程序只要加载了HungrySingleton,就有一个HungrySingleton对象
* create on: 2011-05-27
* @author sylor.liu
* @version 1.0
* @since jdk1.6
*/
public class HungrySingleton {
private static HungrySingleton hs = new HungrySingleton();
// 保证只有使用getInstance方法才能获得该类的对象实例
private HungrySingleton(){
}
public static HungrySingleton getInstance(){
return hs;
}
}
package singletonPattern;
/**
* describe: 懒汉式单例模式
* 优点: 只有在需要使用LazySingleton1对象时,才真正生成一个LazySingleton1对象
* 缺点: 使用的方法级的锁,较HungrySingleton.getInstance方法,获得单例对象消费更多空间、时间
* create on: 2011-05-27
* @author sylor.liu
* @version 1.0
* @since jdk1.6
*/
public class LazySingleton1 {
private static LazySingleton1 ls1;
// 保证只有使用getInstance方法才能获得该类的对象实例
private LazySingleton1(){
}
public static synchronized LazySingleton1 getInstance(){
ls1 = new LazySingleton1();
return ls1;
}
}
package singletonPattern;
/**
* describe: 懒汉式单例模式:
* 优点: 只有在需要使用LazySingleton2对象时,才真正生成一个LazySingleton2对象
* 且使用了仅使用块级的锁
* BUG: 会因为某些Java 平台内存模型允许无序写入,使得getInstance方法可能返回一个尚未执行构造函数的对象
* create on: 2011-05-27
* @author sylor.liu
* @version 1.0
* @since jdk1.6
*/
public class LazySingleton2 {
private static LazySingleton2 ls2;
// 保证只有使用getInstance方法才能获得该类的对象实例
private LazySingleton2(){
}
public static LazySingleton2 getInstance(){
if(ls2 == null){
synchronized (LazySingleton2.class) {
// 双重检查锁
if(ls2 == null){
ls2 = new LazySingleton2();
}
}
}
return ls2;
}
}