单例模式之懒汉的并发问题

本文深入探讨了单例模式中的饿汉模式与懒汉模式,并详细分析了懒汉模式下可能出现的并发问题及其解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

饿汉模式:

class Single{

  private staitc final Single s= new Single();

  private Single(){}

  public static Single getSingle(){

    return s;

  }

}  

懒汉模式:

class Single{

  private static Single s= null;

  private Single(){}

  public static Single getSingle(){

    if(s == null){

        -->A线程

        -->B线程

      s  =  new Single();

      return s;

    }  

  }

}

 

在这里使用懒汉模式有一个安全性问题:

就是s为共享数据,可能会并发的访问getSingle()方法。当多线程访问时,一个A线程进来后,可能调用了sleep()方法在这里沉睡;一个B线程也可能在沉睡,当A线程醒来后,就会new一个对象,B线程醒来也会new一个对象;这样就不符合我们单例模式的特点了。

解决方案:使用synchronized方法进行线程同步

另一个问题,当加了synchronized后,那么很多线程来访问时,都要判断一下锁是哪个,这就造成速率下降

解决方案:在synchronized方法后添加instance是否为null的判断,这样当下一个线程访问时发现instance非空后直接返回前面线程实例化后的对象

 

 

public staitc Single getSingle(){

  if(s == null){

    synchronized(Single.class){  -->B线程,等着A解锁才让进去

      if(s == null){

          -->A线程

        s = new Single();

      }

    }

  return s;

  }

}

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值