实现方式:

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种实现方式,其六:双重检查相关推荐

  1. 设计模式之单例模式8种实现方式,其五:懒汉式(线程不安全,同步代码块)

    实现方式: 1.构造方法私有化 2.创建类的静态变量,不实例化 3.向外部暴露一个静态的公共方法,并判断是否存在实例,如果不存在,则实例化 4.在公共方法的内部生成实例的代码块加上synchroniz ...

  2. 设计模式之单例模式8种实现方式,其八:枚举方式

    实现方式: package singlePattern;enum Singleton{INSTANCE;public void method(){} } 优缺点说明: 1.这借助JDK1.5中添加的枚 ...

  3. 设计模式之单例模式8种实现方式,其一:饿汉式-静态常量饿汉式

    实现方式分为3步骤: 1.构造方法私有化 2.类的内部创建对象 3.向外部暴露一个静态的公共方法 实例: package singlePattern;public class SinglePatter ...

  4. 设计模式之单例模式8种实现方式,其七:静态内部类

    实现方式: 1.构造方法私有化 2.创建静态内部类 3.在静态内部类里面创建外面类的final修饰的实例 4.通过静态共有方法去返回创建的实例 代码如下: package singlePattern; ...

  5. 设计模式之单例模式8种实现方式,其四:懒汉式(线程安全,同步方法)

    实现方式: 1.构造方法私有化 2.创建类的静态变量,不实例化 3.向外部暴露一个静态的公共方法,并判断是否存在实例,如果不存在,则实例化 4.在外部暴露的公共方法上添加synchronized关键字 ...

  6. 设计模式之单例模式8种实现方式,其三:懒汉式(线程不安全)

    实现方式: 1.构造方法私有化 2.创建类的静态变量,不实例化 3.向外部暴露一个静态的公共方法,并判断是否存在实例,如果不存在,则实例化 案例: package singlePattern;publ ...

  7. 设计模式之单例模式8种实现方式,其二:饿汉式-静态代码块饿汉式

    饿汉式(静态代码块)应用步骤: 1.构造器私有化 2.创建类的静态变量,不实例化 3.静态代码块实例化 4.向外部暴露一个静态的公共方法 案例: package singlePattern;publi ...

  8. java设计模式之单例模式(七种方法)

    单例模式:个人认为这个是最简单的一种设计模式,而且也是在我们开发中最常用的一个设计模式. 单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个 ...

  9. java设计模式之——单例模式(八种实现)

    一.介绍 有时,我们需要某个类的实例始终只有一个,举个例子,如果用面向对象语言写的操作系统,那么桌面这个实例肯定就只有一个,无论从哪个地方进入的桌面,都是同一个. 所谓类的单例设计模式,就是采取一定的 ...

最新文章

  1. 模拟退火 HDU - 2899 Strange Function
  2. R语言data.table导入数据实战:把data.frame数据转化为data.table数据
  3. 洛谷——P2590 [ZJOI2008]树的统计(树链剖分模板练手)
  4. Linux C高级编程——目录操作
  5. 阿里云ECS服务器CentOS7上用户管理操作
  6. iOS开发中常见的性能优化技巧
  7. 在Ruby中,如何跳过.each循环中的循环,类似于‘continue‘[duplicate]
  8. C# dataGridView控件 左上角加string
  9. Mybatis插件机制原理
  10. 展讯平台实现维吾尔语的几种方法
  11. 淘宝店铺装修:如何实现全屏1920px,从上到下!
  12. python有趣的简单代码-盘点10个一行强大的、有趣的Python源代码
  13. 一步一步教你写股票走势图——分时图三(对齐图表、自定义高亮)
  14. linux磁盘空间满如何清理,linux磁盘空间不足怎么办,磁盘清理方法
  15. R语言使用:符号生成向量数据、使用pie函数可视化饼图、自定义设置饼图色彩为彩虹色
  16. 手机网页通过js打开app
  17. Python数据可视化(趋势图、条形图、动态图)
  18. 决策树first task之框架搭建和提出问题
  19. Learn-设计模式系列-①七大原则
  20. C语言实现交换两个数

热门文章

  1. 计算机丢失winmm.dll,winmm.dll
  2. Windows ESXI 5.5 升級到 VCSA 6.5
  3. Java设计模式学习总结(8)——结构型模式之桥接模式
  4. Maven学习总结(17)——深入理解maven灵活的构建
  5. python开发环境anaconda3_Python环境管理(Anaconda3)
  6. Linux 用inotify监听文件和目录
  7. nginx配置不记录指定文件类型日志
  8. WSS(Windows Storage Server)2008R2使用指南(三)配置及使用篇
  9. huffman编码——原理与实现
  10. ASP.NET站点构建之减少不必要的请求