单例模式二(懒汉式)

  上一篇文章讲到了饿汉式有占用资源而不使用的嫌疑,那我们就应该考虑到调用的时候在生成对象。

  改后的第一版本

public class LazySingletion {
    private LazySingletion(){

    }
    private static   LazySingletion single;

    protected   static LazySingletion getInstance(){
        if(single == null ){
            single = new LazySingletion();
        }
        return  single;
    }
}

 这里先买个关子,大家看出了有这问题没?

1.0版本会有线程不安全的情况,在多线程下,会出现多个对象实例。

新建一个类实现Runnable接口

public class ExectorThread implements Runnable {
    public void run() {
        LazySingletion singleton =    LazySingletion.getInstance();
        System.out.println(Thread.currentThread().getName()+":"+singleton);
    }
}

新建测试类 

public class Test {
    public static void main(String[] args) {
        Thread thread1 = new Thread(new ExectorThread());
        Thread thread2 = new Thread(new ExectorThread());
        thread1.start();
        thread2.start();
        System.out.println("====");
    }
}

通过多次测试,就会发现结果可能出现相同对象,也可能出现不同。

那这个时候我们就可以考虑对创建对象的函数进行加锁。

2.0版本

public class LazySingletion {
    private LazySingletion(){

    }
    private static   LazySingletion single;

    protected  synchronized static LazySingletion getInstance(){
        if(single == null ){
            single = new LazySingletion();
        }
        return  single;
    }
}

 这样子就避免了线程不安全,但这也存在问题,那就是加锁后,其他线程要等待,容易造成性能下降。

那如何解决?大家先思考,下一节内容进行简答

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值