把烦恼都抛给虚拟机——InstanceHolder单例

01

 

你知道的

 

有段时间没有发文了,最近全量复工了,公司这边也接了一个比较重要的项目。也感谢大家,在断更的这段日子里依然不离不弃。

 

毕竟,我的读者智商超越了99%的人。

 

不过工作归工作,学习的进程还是不能停的。

 

今天,就向大家介绍一款我最近遇到的神奇的单例写法。

 

说起单例,相信大家一定都不陌生了,什么懒汉式,饿汉式,双重检查。。。。。。单例的常规写法相信大家一定都能信手拈来。

 

可是今天向大家介绍的这种,可能并不常见。

 

鲁迅曾经说过:“Talk is cheap,show me the fucking code!”

 

把烦恼都抛给虚拟机——InstanceHolder单例_第1张图片

 

 

 

02

 

单例的后浪——InstanceHolder


 

public class Singleton {
/**
* 类级的内部类,也就是静态的成员式内部类,该内部类的实例与外部类的实例
* 没有绑定关系,而且只有被调用到才会装载,从而实现了延迟加载
*/
private static class SingletonHolder{
/**
* 静态初始化器,由JVM来保证线程安全
*/
private static Singleton instance = new Singleton();
}
/**
* 私有化构造方法
*/
private Singleton(){
}
public static Singleton getInstance(){
return SingletonHolder.instance;
}
}

下面我们就来分析一下,为什么它就能实现单例了呢。

 

首先,让我们看Singleton类,同其他常规的单例一样,他也是将构造函数进行了私有化,并且实现了getInstance函数,但是在getInstance的实现里,他返回的是SingletonHolder.instance,也就是通过SingletonHolder的静态变量来创建的Singleton实例。

 

熟悉Java虚拟机的朋友一定都知道,一个类的静态方法区和静态变量都是在什么时候被执行和加载的?这个类被第一次加载进内存的时候嘛,所以说,当我们调用了getInstance方法的时候,就调用到了SingletonHolder类,而虚拟机发现,”WC,这个类还没被加载,赶紧安排上”,他就开始把SingletonHolder加载进内存并开始加载其中的静态方法区和静态变量,这个时候,我们的instance变量也就被赋上了值。

 

而且这样写的好处在哪?不需要我们来管理线程间的同步问题了,因为虚拟机在类进行加载的时候会帮助我们做好这件事,所以,这种写法可以说是一种写法极为简单而且还高效,安全的写法。

 

现在,这种写法已经在我所负责的项目中进行使用了,你也快来试试吧。

 

 


                                                                                点个赞再走呗

 

                                                               最豪横的互联网干货,扫一扫即刻拥有

 

把烦恼都抛给虚拟机——InstanceHolder单例_第2张图片

你可能感兴趣的:(Android开发那些事)