如何在Java中使用双重检查锁实现单例
发布网友
发布时间:2022-04-22 05:09
我来回答
共4个回答
热心网友
时间:2023-07-11 21:38
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;
}
}
热心网友
时间:2023-07-11 21:38
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; } } 用这种方式解决了懒汉式的线程安全问题,也提高了效率,但是在实际开发中还是用饿汉式的比较多,毕竟这个代码比较多,比较繁琐。
热心网友
时间:2023-07-11 21:39
public static Singleton getInstanceDC() {
if (_instance == null) { // Single Checked
synchronized (Singleton.class) {
if (_instance == null) { // Double checked
_instance = new Singleton();
}
}
}
return _instance;
}
热心网友
时间:2023-07-11 21:39
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;
}
}