Java优雅的单例模式

一、饿汉模式

public class SingleOne {
	
	public static SingleOne  singleOne=new SingleOne(); 

}

优点:多线程安全

缺点:项目启动慢,因为第一次加载需要实例化,且违背了Java随用随加载的原则

二、懒汉模式

public class SingleTwo {
	private static SingleTwo singleTwo;

	public static SingleTwo getInstance() {
		if (singleTwo == null) {
			singleTwo = new SingleTwo();
		}

		return singleTwo;
	}

}

优点:实现了随用随加载

缺点:多线程不安全,如果遇见多线程,可能被多次实例化

解决:在getInstance处加入synchronized,但是缺点就是效率不高,因为每次调用都会同步

三、DCL单例

public class DCLSingle {
	private static DCLSingle instance;
    private DCLSingle() {
        
    }
    public static DCLSingle getInstance(){
        if(instance==null){
            synchronized (DCLSingle.class) {
                if(instance==null){
                    instance=new DCLSingle();
                }
                
            }
        }
        return instance;
    }
}

绝大多数情况下是安全的,但是在高并发的情况下回被实例化两次

原因:jvm调用机制的问题,指令集乱序

解决:可给DCLSingle静态对象加volatile,但是效率低

四、优雅的单例模式

public class SingleThree {
	
	private SingleThree() {
	}
	
	private static class SingleHolder{
		private static final SingleThree instance=new  SingleThree();
	}
	
	public static SingleThree getInstance(){
		
		return SingleHolder.instance;
	}

}

优点:线程安全,随用随加载,不会被多次实例化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值