单例模式代码实现

时间:2025-03-25 22:17:52

双检查锁机制(Double Check Locking)实现

public class Singleton {
	//使用 volatile 关键字保变量可见性 
    private volatile static Singleton instance = null; 
    private Singleton(){} //私有化构造方法
    public static Singleton getInstance() { 
        if(instance == null){
		    synchronized () { 
		        if(instance == null){//二次检查  
		        	instance = new Singleton(); 
		        } 
		    } 
		} 
        return instance; 
    } 
}

在声明变量时使用了 volatile 关键字来保证其线程间的可见性;在同步代码块中使用二次检查,以保证其不被重复实例化
同时在调用getInstance()方法时不进行同步锁,效率高。这种实现方式既保证了其高效性,也保证了其线程安全性。

静态内置类方式实现

public class Singleton {
    private static class SingletonHandler{ 
        private static Singleton instance = new Singleton(); 
    } 
    private Singleton(){} 
    public static Singleton getInstance() { 
        return ; 
    }
}

第一次加载Singleton类时不会初始化instance,只有在第一次调用getInstance()方法时,虚拟机会加载SingletonHolder类,初始化instance。

这种方式既保证线程安全,单例对象的唯一,也延迟了单例的初始化,推荐使用这种方式来实现单例模式。

枚举方式实现

public class ClassFactory {
	private enum EnumSingleton{ //将枚举类封装,遵循"职责单一原则"
		singletonFactory; 
        private Singleton instance; 
        private EnumSingleton(){//枚举类的构造方法在类加载时被实例化 
            instance = new Singleton(); 
        } 
        public Singleton getInstance(){ 
            return instance; 
        } 
	}
	public static Singleton getInstance(){ 
        return (); 
    } 
}
class Singleton {//需要获实现单例的类,比如数据库连接 Connection  
    public Singleton(){} 
}

在使用枚举时,构造方法会被自动调用,利用这一特性也可以实现单例;默认枚举实例的创建是线程安全的,即使反序列化也不会生成新的实例,任何情况下都是一个单例。