单例模式(懒汉模式)中的线程同步问题

在单例懒汉设计模式中,当有多个线程访问getInstance方法时会出现线程安全问题:解决方法如下:


/**
* 懒汉式单例模式中的线程访问安全问题
*
* 1.当有多个线程同时访问getInstance方法获得对象时,可能会出现访问资源的错误,所以需要在里面加上动态锁
* 2.由于getInstance方法是静态方法,所以同步锁为Single.class
* 3.加上同步代码块之后可能会导致程序的效率降低,在同步代码块外面判断一次s是否为空。
* @author Yxx
*
*/
public class Single {
private Single(){}
private static Single s = null;
private static Single getInstance() throws InterruptedException{
if(s==null){
synchronized (Single.class) {
if(s==null){
Thread.sleep(10);
s = new Single();
}
}
}
return s;
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
懒汉单例模式在第一次调用getInstance()方法时才会创建实例,如果多个线程同时调用getInstance()方法,就会创建多个实例,导致线程安全问题。为了解决这个问题,可以采用以下几种方式: 1. synchronized关键字同步getInstance()方法,确保多个线程同时访问时只有一个线程可以执行getInstance()方法,其他线程需要等待。但是这种方式会降低程序的性能,因为每个线程都需要获取锁。 2. 双重校验锁(double checked locking):在synchronized关键字上面加一层判断,当实例已经被创建时,直接返回实例,避免了不必要的锁操作。这种方式可以提高程序的性能,但是需要注意内存可见性问题。 ``` public class Singleton { private static volatile Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } } } return instance; } } ``` 3. 静态内部类:使用静态内部类创建单例对象,因为静态内部类只会被加载一次,所以不会有线程安全问题。当getInstance()方法第一次被调用时,会加载内部类并创建单例对象。 ``` public class Singleton { private Singleton() {} private static class SingletonHolder { private static final Singleton INSTANCE = new Singleton(); } public static Singleton getInstance() { return SingletonHolder.INSTANCE; } } ``` 4. 枚举:使用枚举创建单例对象,枚举类型是线程安全的,并且只会被实例化一次。因此,枚举可以作为实现单例模式的一种方式。 ``` public enum Singleton { INSTANCE; public void doSomething() {...} } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值