单例模式代码实现

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

public class Singleton {
	//使用 volatile 关键字保变量可见性 
    private volatile static Singleton instance = null; 
    private Singleton(){} //私有化构造方法
    public static Singleton getInstance() { 
        if(instance == null){
		    synchronized (Singleton.class) { 
		        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 SingletonHandler.instance; 
    }
}

第一次加载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 EnumSingleton.singletonFactory.getInstance(); 
    } 
}
class Singleton {//需要获实现单例的类,比如数据库连接 Connection  
    public Singleton(){} 
}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值