您的位置:首页 > 其它

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

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

一, 单例模式特点:

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: