单例模式常用的的两种写法
2016-05-07 09:35
483 查看
单例模式很常用,但是写法各异,哪种更合理高效呢。一般单例都是五种写法。懒汉式,饿汉式,双重校验锁,枚举和静态内部类。什么时候用懒汉式,何时用饿汉式应该清楚。
2)它必须自行创建这个实例。
3)它必须自行向整个系统提供这个实例。
首先判断instance是不是为null,如果为null,加锁初始化;如果不为null,直接返回instance。 这就是double-checked locking设计实现单例模式。平时这样用,强烈推荐。
未完待续,杜乾,Dusan ,Q 291902259
一, 单例模式特点:
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
相关文章推荐
- C++ Primer 学习笔记_54_类与数据抽象 -复制构造函数、赋值操作符
- 建立用户模型
- Oracle 11g Data Guard 之物理备库角色转换
- C++ Primer 学习笔记_53_类与数据抽象 --友元、static成员
- 【计算机视觉】森林火灾检测-2
- coreseek生成索引、合并建主索引和增量索引、重建整个索引详解
- t文森特
- Web服务器之Http压缩(GZip)
- C++ Primer 学习笔记_52_类与数据抽象 -构造函数【下】
- 【计算机视觉】森林火灾检测-1
- AIDL完全学习手册
- 恢复oracle中update或delete的数据
- 文章标题
- C++ Primer 学习笔记_51_类与数据抽象 -构造函数【上】
- java中超大大数字的计算方法
- 小酌重构系列[7]——使用委派代替继承
- 常用正则表达式
- ListView添加删除FooterView HeaderView
- WCF-WCF中传输泛型List 对象(转)
- winfrom DataGridView 总结