设计模式之单例模式-java实现
1、 volatile+双重检验锁+懒汉式
volatile作用:防止指令重排序,因为synchronized外面的if判断语句可以直接范文到instance,如果在进行instance初始化的时候,先执行了构造方法,并且这个时候执行了外部的if语句,就会返回一个半初始化的对象,使用中会出现错误。
两个if的判断是,防止每个线程过来都去获取锁,获取不到就会产生上下文切换,这样效率很低,所以如果instance已经不为空了,就不需要去获取锁
- 代码实现
@Slf4j
public class Singleton {
private volatile static Singleton instance;
public Singleton(){}
public static Singleton getInstance() {
if(instance == null) {
synchronized (Singleton.class) {
if(instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
public static void main(String[] args) {
for(int i = 0; i < 100; i++) {
int n = i;
new Thread(()->{
log.info("第{}个线程获得的对象实例的hashcode是{}", n, Singleton.getInstance().hashCode());
}).start();
}
}
}
- 执行结果
2、懒汉式
- 代码实现
@Slf4j
public class Singleton2 {
private static Singleton2 instance;
public Singleton2(){}
public static Singleton2 getInstance() {
if(instance == null) {
instance = new Singleton2();
}
return instance;
}
public static void main(String[] args) {
for(int i = 0; i < 10000; i++) {
int n = i;
new Thread(()->{
log.info("第{}个线程得到的对象实例的hashcode是{}", n, Singleton2.getInstance().hashCode());
}).start();
}
}
}
3、饿汉式
- 代码实现
private static Singleton3 instace = new Singleton3();
public Singleton3(){}
public static Singleton3 getInstance() {
return instace;
}