又见单例模式
Posted Draper的技术小站
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了又见单例模式相关的知识,希望对你有一定的参考价值。
单例模式怎么实现不说了,实现的方式有很多种,其中一种是双检锁,觉得都快被说烂了,没想到今天看到又被人说出花儿了,感觉真的是学海无涯
实现单例我们一般的关注点是在以下的几个方面
构造函数是私有的,不能通过
new
关键字来创建对象,一般是通过getInstance
方法来获取对象单例模式是否线程安全
是否支持迟加载
getInstance
的性能是否足够高
今天让我出花的是主要是第四点
先上一下我们通常的单例模式
public class Singleton {
private volatile static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
按常理来说这就足够了,但是...这居然还有优化的地方! 上代码
public static Singleton getInstance() {
Singleton temp = instance;
if (temp == null) {
synchronized (Singleton.class) {
if (temp == null) {
temp = new Singleton();
instance = temp;
}
}
}
return instance;
}
注意到第 2 行,把全局变量赋值给了一个局部变量,然后对这个局部变量进行校验,最后在第 7 行将创建出来的对象赋予全局变量 instance
为什么这么做
Using
localRef
, we are reducing the access of volatile variable to just one for positive usecase. If we do not use localRef, then we would have to access volatile variable twice - once
使用本地局部变量可以减少对 volatile
变量的访问,提高程序的性能
参考资料:Threadsafe Singleton Design Pattern Java
以上是关于又见单例模式的主要内容,如果未能解决你的问题,请参考以下文章