单例模式常用的的两种写法

2019-04-13 14:07发布

单例模式很常用,但是写法各异,哪种更合理高效呢。一般单例都是五种写法。懒汉式,饿汉式,双重校验锁,枚举和静态内部类。什么时候用懒汉式,何时用饿汉式应该清楚。

一, 单例模式特点:

1)一个类只有一个实例。
2)它必须自行创建这个实例。
3)它必须自行向整个系统提供这个实例。

二,懒汉式+双重校验锁

懒汉式,类加载时不初始化实例,可以延迟加载实例。通过getInstance()方法,并且它的构造方法是private的,这样就保证了只能有一个对象存在。双重检查锁定才能够正常达到单例效果。线程安全,更高效。 public class MyOkHttpUtils { public static OkHttpClient okHttpClient; public static MyOkHttpUtils myOkHttpUtils; public static MyOkHttpUtils getInstance() { if (myOkHttpUtils == null) { synchronized (MyOkHttpUtils.class) { if (myOkHttpUtils == null) { myOkHttpUtils = new MyOkHttpUtils(); } } } return myOkHttpUtils; } private MyOkHttpUtils() { if (okHttpClient == null) { OkHttpClient.Builder okHttpClientBuilder = new OkHttpClient.Builder(); okHttpClientBuilder.connectTimeout(5, TimeUnit.SECONDS); okHttpClient = okHttpClientBuilder.build(); } } } 首先判断instance是不是为null,如果为null,加锁初始化;如果不为null,直接返回instance。 这就是double-checked locking设计实现单例模式。平时这样用,强烈推荐。

三,饿汉式单例模式

饿汉式单例模式,在类加载时就完成了初始化,所以类加载较慢,但获取对象的速度快。这种单例模式写法: //在访问HttpMethods时创建单例 private static class SingletonHolder{ private static final HttpMethods INSTANCE = new HttpMethods(); } //获取单例 public static HttpMethods getInstance(){ return SingletonHolder.INSTANCE; }

四,总结

在项目中,经常使用双重校验锁实现懒汉式单例模式,线程安全,高效。比如下载管理器,okHttpClient实例,确保整个项目只有一个实例,资源有效利用。
未完待续,杜乾,Dusan ,Q 291902259