Java——单例设计模式中懒汉式并发访问的安全问题

//单例设计模式中懒汉式并发访问的安全问题
//饿汉式 无安全问题
class Single{
    private static final Single s = new Single();
    private Single(){}

    public static Single getInstance(){
        return s;
    }
}
//懒汉式 错 有安全问题
/*class Single2{
    private static Single2 s;
    private Single2(){}

    public static Single2 getInstance(){
        if(s==null){
            //--->t1  --->t2在这里线程有可能被抢走CPU
            //之后判断s也为空,也会执行下面的语句,就
            //不符合单例设计模式的特点了,所以应该写成
            //下面一段代码
            s = new Single2();
        }
        return s;
    }
}*/

//懒汉式 对
class Single2{
    private static Single2 s;
    private Single2(){};
    public static Single2 getInstance(){
        if(s==null){//这个判断条件是优化,可以提高效率,不加也正确
            //如果没有上面这个if判断,所有的线程都得执行下面一行代码,即判断锁
            //判断锁很浪费资源,加上上面的if判断,至少从第三个线程开始就不用判断锁了
            //线程执行完同步代码块中的内容下一个线程才能拿到CPU
            //所以这里就保证了单例
            synchronized(Single2.class){
                if(s==null){
                    s = new Single2();
                }
            }
        }
        return s;
    }
}
class Test implements Runnable{
    public void run(){
        Single s = Single.getInstance();
    }
}
class test{
    public static void main(String[] args){
        Test test = new Test();
        Thread t1 = new Thread(test);
        Thread t2 = new Thread(test);
        t1.start();
        t2.start();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值