作者:倔强的追求 | 来源:互联网 | 2023-10-13 14:04
本文由编程笔记#小编为大家整理,主要介绍了关于双重检查创建单例对象相关的知识,希望对你有一定的参考价值。
public class Singleton {
static Singleton instance;
static Singleton getInstance(){
if (instance == null) {
synchronized(Singleton.class) {
if (instance == null)
instance = new Singleton();
}
}
return instance;
}
}
利用双重检查创建单例对象: 在获取实例getInstance()的方法中, 首先判断instance是否为空, 如果为空, 则锁定Singleton.class并再次检查instance是否为空, 如果还为空则创建一个Singleton实例
假设有A,B两个线程同时调用getInstance()方法, 他们会同时发现instance == null, 于是同时对Singleton.class加锁, 此时JVM保证只有一个线程能加锁成功(假设是A), 另外一个线程则会处于等待状态(假设是B); 线程A会创建一个Singleton实例, 之后释放锁, 锁被释放后, 线程B被唤醒, 此时B可以加锁, 加锁成功后, 线程B检查instance == null 时发现已经创建过Singleton实例, 所以B不会再创建一个Singleton实例