设计模式之单例模式8种实现方式,其六:双重检查
实现方式:
1.构造方法私有化
2.创建类的静态变量,不实例化,给该静态变量添加volatile关键字,设定instance为共享变量
3.向外部暴露一个静态的公共方法,并判断是否存在实例,如果不存在,则实例化
4.在公共方法的内部生成实例的代码块加上synchronized关键字(给该代码块加锁)
案例:
package singlePattern;public class SinglePattern4 {private SinglePattern4(){}private static volatile SinglePattern4 instance;public static SinglePattern4 getInstance(){if(instance == null){synchronized (SinglePattern4.class) {if(instance == null){instance = new SinglePattern4();}}}return instance;}}
优缺点分析:
1.Double-Check概念是多线程开发中常使用到的,如代码所示,我们进行了两次if(instance == null) 检查,这样就可以保证线程安全了
2.这样,实例化代码只执行一次,后面再次访问时,判断if(instance == null),直接return 实例化对象,也避免的反复进行方法同步。
3.线程安全:延迟加载,效率较高
4.结论:在实际开发中,推荐使用这种单利设计模式
设计模式之单例模式8种实现方式,其六:双重检查相关推荐
- 设计模式之单例模式8种实现方式,其五:懒汉式(线程不安全,同步代码块)
实现方式: 1.构造方法私有化 2.创建类的静态变量,不实例化 3.向外部暴露一个静态的公共方法,并判断是否存在实例,如果不存在,则实例化 4.在公共方法的内部生成实例的代码块加上synchroniz ...
- 设计模式之单例模式8种实现方式,其八:枚举方式
实现方式: package singlePattern;enum Singleton{INSTANCE;public void method(){} } 优缺点说明: 1.这借助JDK1.5中添加的枚 ...
- 设计模式之单例模式8种实现方式,其一:饿汉式-静态常量饿汉式
实现方式分为3步骤: 1.构造方法私有化 2.类的内部创建对象 3.向外部暴露一个静态的公共方法 实例: package singlePattern;public class SinglePatter ...
- 设计模式之单例模式8种实现方式,其七:静态内部类
实现方式: 1.构造方法私有化 2.创建静态内部类 3.在静态内部类里面创建外面类的final修饰的实例 4.通过静态共有方法去返回创建的实例 代码如下: package singlePattern; ...
- 设计模式之单例模式8种实现方式,其四:懒汉式(线程安全,同步方法)
实现方式: 1.构造方法私有化 2.创建类的静态变量,不实例化 3.向外部暴露一个静态的公共方法,并判断是否存在实例,如果不存在,则实例化 4.在外部暴露的公共方法上添加synchronized关键字 ...
- 设计模式之单例模式8种实现方式,其三:懒汉式(线程不安全)
实现方式: 1.构造方法私有化 2.创建类的静态变量,不实例化 3.向外部暴露一个静态的公共方法,并判断是否存在实例,如果不存在,则实例化 案例: package singlePattern;publ ...
- 设计模式之单例模式8种实现方式,其二:饿汉式-静态代码块饿汉式
饿汉式(静态代码块)应用步骤: 1.构造器私有化 2.创建类的静态变量,不实例化 3.静态代码块实例化 4.向外部暴露一个静态的公共方法 案例: package singlePattern;publi ...
- java设计模式之单例模式(七种方法)
单例模式:个人认为这个是最简单的一种设计模式,而且也是在我们开发中最常用的一个设计模式. 单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个 ...
- java设计模式之——单例模式(八种实现)
一.介绍 有时,我们需要某个类的实例始终只有一个,举个例子,如果用面向对象语言写的操作系统,那么桌面这个实例肯定就只有一个,无论从哪个地方进入的桌面,都是同一个. 所谓类的单例设计模式,就是采取一定的 ...
最新文章
- 模拟退火 HDU - 2899 Strange Function
- R语言data.table导入数据实战:把data.frame数据转化为data.table数据
- 洛谷——P2590 [ZJOI2008]树的统计(树链剖分模板练手)
- Linux C高级编程——目录操作
- 阿里云ECS服务器CentOS7上用户管理操作
- iOS开发中常见的性能优化技巧
- 在Ruby中,如何跳过.each循环中的循环,类似于‘continue‘[duplicate]
- C# dataGridView控件 左上角加string
- Mybatis插件机制原理
- 展讯平台实现维吾尔语的几种方法
- 淘宝店铺装修:如何实现全屏1920px,从上到下!
- python有趣的简单代码-盘点10个一行强大的、有趣的Python源代码
- 一步一步教你写股票走势图——分时图三(对齐图表、自定义高亮)
- linux磁盘空间满如何清理,linux磁盘空间不足怎么办,磁盘清理方法
- R语言使用:符号生成向量数据、使用pie函数可视化饼图、自定义设置饼图色彩为彩虹色
- 手机网页通过js打开app
- Python数据可视化(趋势图、条形图、动态图)
- 决策树first task之框架搭建和提出问题
- Learn-设计模式系列-①七大原则
- C语言实现交换两个数
热门文章
- 计算机丢失winmm.dll,winmm.dll
- Windows ESXI 5.5 升級到 VCSA 6.5
- Java设计模式学习总结(8)——结构型模式之桥接模式
- Maven学习总结(17)——深入理解maven灵活的构建
- python开发环境anaconda3_Python环境管理(Anaconda3)
- Linux 用inotify监听文件和目录
- nginx配置不记录指定文件类型日志
- WSS(Windows Storage Server)2008R2使用指南(三)配置及使用篇
- huffman编码——原理与实现
- ASP.NET站点构建之减少不必要的请求