如何在Java中使用双重检查锁实现单例

发布网友

我来回答

4个回答

热心网友

public Singleton {
    private Singleton instance;
    private Singleton() {} // 构造器私有化
    public static Singleton getInstance() {
        if (instance == null) { // 第一次检查不加锁
            synchronized(Singleton.class) { // 加锁 
                if (instance == null) { // 第二次检查是在加锁的情况下
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

热心网友

public class SingleDemo {   private static SingleDemo s = null;   private SingleDemo(){}   public static SingleDemo getInstance(){   /*如果第一个线程获取到了单例的实例对象,   * 后面的线程再获取实例的时候不需要进入同步代码块中了*/   if(s == null){   //同步代码块用的锁是单例的字节码文件对象,且只能用这个锁   synchronized(SingleDemo.class){   if(s == null){   s = new SingleDemo();   }   }   }   return s;   }   }   用这种方式解决了懒汉式的线程安全问题,也提高了效率,但是在实际开发中还是用饿汉式的比较多,毕竟这个代码比较多,比较繁琐。

热心网友

public static Singleton getInstanceDC() {
    if (_instance == null) {                // Single Checked
        synchronized (Singleton.class) {
            if (_instance == null) {        // Double checked
                _instance = new Singleton();
            }
        }
    }
    return _instance;
}

热心网友

public 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;
    }
}

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com