单例模式很常用,但是写法各异,哪种更合理高效呢。一般单例都是五种写法。懒汉式,饿汉式,双重校验锁,枚举和静态内部类。什么时候用懒汉式,何时用饿汉式应该清楚。
一, 单例模式特点:
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设计实现单例模式。平时这样用,强烈推荐。
三,饿汉式单例模式
饿汉式单例模式,在类加载时就完成了初始化,所以类加载较慢,但获取对象的速度快。这种单例模式写法:
private static class SingletonHolder{
private static final HttpMethods INSTANCE = new HttpMethods();
}
public static HttpMethods getInstance(){
return SingletonHolder.INSTANCE;
}
四,总结
在项目中,经常使用双重校验锁实现懒汉式单例模式,线程安全,高效。比如下载管理器,okHttpClient实例,确保整个项目只有一个实例,资源有效利用。
未完待续,杜乾,Dusan ,Q 291902259