单例模式(饿汉式,懒汉式,双重检验锁)

本文介绍了Java中实现单例模式的三种方式:饿汉式保证了线程安全但可能过早初始化,懒汉式延迟加载但线程不安全,而双重检验锁(DCL)在保证线程安全的同时延迟初始化,优化了性能。volatile关键字在其中起到了确保可见性和避免指令重排序的作用。
摘要由CSDN通过智能技术生成

单例模式(饿汉式,懒汉式,双重检验锁)

三步走:
1,构造私有化(保证对象的产生的个数)
2,单例类的内部提供这个唯一的对象(static)
3,单例类提供返回这个唯一对象的静态方法供外部使用

  //饿汉式
    public static class SingleHungry{
        //尽可能的满足目前,先把能拿到的都拿到
        private static SingleHungry singleHungry=new SingleHungry();
        private SingleHungry(){}
        public static SingleHungry getStringsingGeleTon(){
            return singleHungry;
        }
    }

懒汉式

public class SingleTonLazy {
    private static volatile SingleTonLazy singleTonLazy;
    static void SingleTonLazyren(){}
    public static  SingleTonLazy getStringlazyRen() {
    //这里会线程不安全;
        if(singleTonLazy==null){
            singleTonLazy = new SingleTonLazy();
        }
        return singleTonLazy;
    }
}

线程安全的懒汉式

public class SingleTonLazy {
    private static volatile SingleTonLazy singleTonLazy;
    static void SingleTonLazyren(){}
    public static  SingleTonLazy getStringlazyRen() {
        if(singleTonLazy==null){
            synchronized (SingleTonLazy.class) {//锁住整个类,线程就安全了
                if (singleTonLazy == null) {
                    singleTonLazy = new SingleTonLazy();
                }
            }
        }
        return singleTonLazy;
    }
}

双重检验锁

public static class Double_Check{
        private static volatile Double_Check double_check;
        //volatile保证可见性
        //(从主存中读到工作方法区在方法区改变的数字会刷新到主存中,在访问这个变量之前)
        //表示着线程本地内存无效,当一个线程修改共享
        // 变量后他会立即被更新到主内存中,其他线程读取共享变量时,会直接从主内存中读取。
        private Double_Check(){}
        static Double_Check getStringDoubleCheck(){
            if(double_check==null){
                synchronized (Double_Check.class){
                    if(double_check==null){
                        double_check=new Double_Check();
                    }
                }
            }
            return double_check; 
        }
    }
}

双重检验锁中的volatile还是有一个作用是: 可以保证return 的对象是完整的,不会被中断,不然返回可能是不完整的对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值