单例模式的懒汉式在多线程的问题

发布时间:2022-07-02 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了单例模式的懒汉式在多线程的问题脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

单例模式的懒汉式在多线程的问题 我们都知道,单例设计模式中有两种方法,一种是饿汉式,另外一种就是懒汉式,具体如下:

饿汉式:

复制代码 package com.seven.exercise.testEception;

/**

  • 单例模式,饿汉式
  • @author Seven

*/ public class SingleDemoHunger {

PRivate SingleDemoHunger() {

}

private static SingleDemoHunger sdh = new SingleDemoHunger();

public static SingleDemoHunger getInstance() {
    return sdh;
}

} 复制代码 懒汉式:

复制代码 package com.seven.exercise.testEception;

/**

  • 懒汉式
  • @author Seven

*/ public class SingleDemo {

/**
 * 私有化构造函数
 */
private SingleDemo(){
    
}

private static SingleDemo singleDemo = null;

/**
 * 提供获取实例的方法
 * @return
 */
public static SingleDemo getInstance(){
    if(singleDemo==null){
        singleDemo = new SingleDemo();
    }
    return singleDemo;
} 

} 复制代码 相信这两种方法大家都知道,但是没有有考虑过在多线程的情况下: 饿汉式属于立即加载,所以不存在在多线程中出现错误的情况;

但是懒汉式的话就有可能出现问题了,如多一个线程执行到判断是否为空的语句

if(singleDemo==null) 的时候,当前线程被阻塞,而第二个线程进来了,这样的话第二个线程创建了新的对象,那么第一个线程被唤醒的时候又创建多一个对象,这样在内存中就存在了两个对象,明显和单例设计模式不符,那么我们应该怎么做呢?

简单,用 synchronized关键字就可以轻松解决:

复制代码 package com.seven.exercise.testEception;

/**

  • 懒汉式
  • @author Seven

*/ public class SingleDemo {

/**
 * 私有化构造函数
 */
private SingleDemo(){
    
}

private static SingleDemo singleDemo = null;

/**
 * 提供获取实例的方法,用synchronized来解决多线程的问题.
 * @return
 */
public static SingleDemo getInstance(){
    synchronized (SingleDemo.class) {
        if(singleDemo==null){
            singleDemo = new SingleDemo();
        }
    }
    return singleDemo;
}

} 复制代码 这样就减少了创建多个实例的可能,但是还是存在创建多个实例的可能性,而且同步锁肯定要消耗资,这样的话就会降低效率,那么有什么办法可以提高效率呢?答案是有的,那就是通过二次判断,这样的话就不用每次都执行同步代码块,这样的话,只需第一次执行的时候比较占资源,以后的话就和之前的一样了:

复制代码 package com.seven.exercise.testEception;

/**

  • 懒汉式
  • @author Seven

*/ public class SingleDemo {

/**
 * 私有化构造函数
 */
private SingleDemo(){
    
}

private static SingleDemo singleDemo = null;

/**
 * 提供获取实例的方法,用synchronized来解决多线程的问题.
 * @return
 */
public static SingleDemo getInstance(){
    //二次判断提高效率
    if(singleDemo==null){
        synchronized (SingleDemo.class) {
            if(singleDemo==null){
                singleDemo = new SingleDemo();
            }
        }
    }
    return singleDemo;
}

} 复制代码 所以,利用synchronized关键字解决多线程问题,用二次判断提高效率~

脚本宝典总结

以上是脚本宝典为你收集整理的单例模式的懒汉式在多线程的问题全部内容,希望文章能够帮你解决单例模式的懒汉式在多线程的问题所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。