首先这两种方式都是延迟初始化机制,就是当要用到的时候再去初始化。

但是Effective Java书中说过:除非绝对必要,否则就不要这么做。

1. DCL (double checked locking)双重检查:

如果出于性能的考虑而需要对实例域(注意这个属性并没有被static修饰)使用延迟初始化,就使用双重检查模式

public class Singleton {private volatile Singleton uniqueInstance;private Singleton(){}public static Singleton getInstance(){if(uniqueInstance == null){ //#1synchronized(Singleton.class){ //#2if(uniqueInstance == null){ //#3uniqueInstance = new Singleton(); //#4System.out.println(Thread.currentThread().getName() + ": uniqueInstance is initalized..."); //#5.1} else {System.out.println(Thread.currentThread().getName() + ": uniqueInstance is not null now..."); //#5.2
                }}}return uniqueInstance;}
}

2. lazy initialization holder class(静态内部类):

如果出于性能的考虑而需要对静态域(注意这个属性被static修饰)使用延迟初始化,就使用lazy initialization holder class模式。

 1 public class Singleton {
 2
 3     private static class SingletonHolder {
 4          /**
 5          * 静态初始化器,由JVM来保证线程安全
 6          */
 7         private static Singleton instance = new Singleton();
 8     }
 9
10     private Singleton(){
11     }
12
13     public static Singleton getInstance(){
14         return SingletonHolder.instance;
15     }
16 }

最后,以上两种方法都不是实现单例模式的最好方式,最好的是枚举模式,coming soon...

转载于:https://www.cnblogs.com/damonhuang/p/5439655.html

单例模式的两种实现方式对比:DCL (double check idiom)双重检查 和 lazy initialization holder class(静态内部类)...相关推荐

  1. 【无标题】单例模式的两种创建方式:饿汉式和懒汉式

    这里写自定义目录标题 单例模式的两种创建方式:饿汉式和懒汉式 欢迎使用Markdown编辑器 新的改变 功能快捷键 合理的创建标题,有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂 ...

  2. Java两种多线程方式对比总结 模拟铁路售票案例

    继承Thread类创建多线程 在Thread类中,提供了一个start()方法,会启动一个新线程并自动调用run()方法 假设售票厅有五个窗口可发售200张票.200张票可以看作是共享的资源,五个窗口 ...

  3. 用python实现单例模式_Python单例模式的两种实现方式

    单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. 比如,某 ...

  4. 单例模式的两种实现方式:恶汉式和懒汉式

    单例模式:采取一定的方法保证在整个软件系统中,对某个类只存在一个对象实例 恶汉式->缺点:对象加载时间过长 优点:是线程安全的 懒汉式->缺点:是线程不安全的 优点:延迟对象的创建 恶汉式 ...

  5. java两种绑定方式_java两种单例模式用法分析

    本文实例讲述了java两种单例模式用法.分享给大家供大家参考,具体如下: 按照加载方式的不同,单例模式有两种实现: private:只能在同一个类中使用 static:该类是类方法,不能调用实例方法. ...

  6. Java多线程两种实现方式的对比

    Java多线程两种实现方式的对比 一种,直接继承Thread类 一种,实现Thread类的Runnable接口 两种方式的区别 比如,售票厅有四个窗口,可以发售某日某次列出的100张车票,此时,100 ...

  7. php 恶汉单例,单例模式的两种方式(恶汉式,懒汉式)

    单例模式的两种形式(恶汉式,懒汉式) 单例模式的特点:解决了一个类在内存的唯一性,这个类的对象只有一个. 写单例模式的步骤: 1. 私有修饰构造方法 2. 在本类的成员位置, new 自己类的对象 3 ...

  8. 单例模式的3种实现方式, 及其性能对比

    2019独角兽企业重金招聘Python工程师标准>>> 1. 懒汉模式(double check), 线程安全, 效率不高, 可以延迟加载 public class Singleto ...

  9. 单例模式的几种实现方式详解以及原理

    单例模式介绍 前言 这是一个的萌新写的博客,以下是学习课程以后的总结,用于个人的复习与总结,如果有误还请多多包容和指正. 了解单例模式: 单例类只能有一个实例 单例必须创建自己的唯一一个实例 单例类必 ...

最新文章

  1. msflexgrid允许大选择_工程中要用多大的电线电缆?一文教你怎么算
  2. stl-vector详解
  3. Nexys3学习手记1:写在前面的话
  4. String、StringBuffer和StringBuilde的区别
  5. 03.三月风雨愁断肠,学习大数据特别忧伤——谈谈AKS创建SQL Server大数据群集创建愁断肠
  6. python 伪多线程_Python实现简单多线程任务队列
  7. python pathos_python运行多线程库pathos时,pymongo递归深度溢出
  8. SQL SERVER数据库 查询sql 多表联查 top命令
  9. c语言编程 通讯录排序,C语言实现一个通讯录
  10. Android开发系列(十一) QQ登陆界面——Android控件使用实例
  11. php 检查货币类型_php 判断函数是否为费用类型(金额/货币:6.02)有小数点
  12. cfree5c语言编写贪吃蛇,刚学C语言,想写一个贪吃蛇的代码
  13. 2021-12-28学习的道路是寂寞的,学成后的成绩是惊艳的。喜欢热闹是生物的本性,耐得住寂寞方显人性尊贵
  14. 聊聊游戏本推荐排行榜 这一款竟成黑马
  15. 扩展访问:Uber Lite App开发始末
  16. Java中Date日期时间的工具类
  17. 传统文化,互联网时代的创业“传家之宝”
  18. RAM/ROM存储器的设计
  19. 第三讲财务报表是如何产生的(财务分析与决策)
  20. [L1 - 15分合集]吉老师的回归

热门文章

  1. Java Calendar.add()方法的使用,参数含义。指定时间差。
  2. 什么是原码、反码、补码?什么是按位与?范围数字按位与!
  3. 伍六七带你学算法 动态规划 ——不同路径
  4. Go语言的错误异常处理机制及其应用
  5. 3分钟4 步快速带你在win10电脑装上openCV3.4 (python使用)
  6. docker run 或者 docker restart 启动镜像就自动退出
  7. pandas dataframe 删除带空值的行 各种空值 (dropna()、isna()、isnull()、fillna())
  8. hexo框架个人博客的搭建(面试加分!)
  9. camera数字降噪(DNR)
  10. No subscribers registered for event class