Java设计模式之单例模式(七种写法)

第一种,懒汉式,lazy初始化,线程不安全,多线程中无法工作:

public class Singleton {private static Singleton instance;private Singleton (){}//私有化构造方法,防止类被实例化public static Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
}

第二种,懒汉式,lazy初始化,线程安全:

  • 优点:第一次调用才初始化,避免内存浪费。
  • 缺点:必须加锁 synchronized 才能保证单例,但加锁会影响效率。
public class Singleton {private static Singleton instance;  private Singleton (){}  public static synchronized Singleton getInstance() {  if (instance == null) {  instance = new Singleton();  }  return instance;  }
}  

第三种,饿汉式,不是lazy初始化,线程安全:
  • 优点:没有加锁,执行效率会提高。
  • 缺点:类加载时就初始化,浪费内存。
public class Singleton {  private static Singleton instance = new Singleton();  private Singleton (){}  public static Singleton getInstance() {  return instance;}
} 

第四种,饿汉式,lazy初始化,线程安全:

public class Singleton {private Singleton instance = null;  static {  instance = new Singleton();}  private Singleton (){}  public static Singleton getInstance() {  return this.instance;}
}  

第五种,静态内部类,lazy初始化,线程安全:

区别第三种,Singleton 类被装载了,instance 不一定被初始化。因为 SingletonHolder 类没有被主动使用;只有通过显式调用 getInstance 方法时,才会显式装载 SingletonHolder 类,从而实例化 instance。
public class Singleton {private static class SingletonHolder {  private static final Singleton INSTANCE = new Singleton();}  private Singleton (){}  public static final Singleton getInstance() {  return SingletonHolder.INSTANCE;}
}  

第六种(枚举),不是lazy初始化,线程安全:

public enum Singleton {INSTANCE;  public void whateverMethod() {  }
} 

第七种,双重校验锁DCL(double-checked locking),lazy初始化,线程安全:JDK1.5 起,采用双锁机制,安全且在多线程情况下能保持高性能。
public class Singleton {private volatile static Singleton singleton;  private Singleton (){}  public static Singleton getSingleton() {  if (singleton == null) {synchronized (Singleton.class) {if (singleton == null) {singleton = new Singleton();}}}return singleton;}
}  

转载于:https://www.cnblogs.com/shen-hua/p/8179046.html

Java设计模式之单例模式(七种写法)相关推荐

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

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

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

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

  3. 设计模式:单例模式7种写法

    原文链接:http://cantellow.iteye.com/blog/838473 第一种(懒汉,线程不安全): Java代码 public class Singleton {private st ...

  4. java中单例的几种写法

    java中单例的几种写法 一单例模式常见的写法 二枚举类型实现单例模式 java中单例的几种写法 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系 ...

  5. JAVA设计模式总结之23种设计模式(重点!!!)

    JAVA设计模式总结之23种设计模式: 一.什么是设计模式 设计模式遵循的原则有6个: 二.设计模式的三个分类 三.各分类中模式的关键点 四.概说23种设计模式 1.单例模式(Singleton) 2 ...

  6. Java设计模式之单例模式的学习

    本篇是本人的第二篇博客 旨在记录本人对于Java设计模式之单例模式的学习和理解,也希望本篇可以对一些正在学习的小伙伴起到一些帮助 单例模式(singleton)的特点: 1.单例模式有且仅有一个实例: ...

  7. 总结一下Java中SQL的九种写法

    因为在做持久层工具开发,现总结一下各种SQL的写法,也算是清晰一下自已的思路: 第一种写法 public void someMethod(){ try Connection conn=...; con ...

  8. python条件语句代码例子_Python 炫技操作:条件语句的七种写法

    原标题:Python 炫技操作:条件语句的七种写法 作者 | 写代码的明哥 责编 | 郭芮 有的人说 Python 入门容易,但是精通难的语言,这点我非常赞同. Python 语言里有许多(而且是越来 ...

  9. JS奇淫技巧:挑战前端黑科技,数值的七种写法,能全看懂的一定是高手

    JS奇淫技巧:数值的七种写法 JS奇淫技巧:挑战前端黑科技,数值的七种写法,能全看懂的一定是高手 你知道吗?在JS编程中,数值可以有很多种写法. 第一种写法: 一般情况而言,数值就是数值. 比如: v ...

最新文章

  1. Unity 4.x游戏开发技巧集锦(内部资料)
  2. redhat中使用securecrt 中文乱码解决办法
  3. 在Eclipse新建菜单中添加JSP
  4. MHA 日常维护命令集
  5. C可变参数详解及其函数设计
  6. PHPExcel设置自动列宽
  7. python变量后面加星号_Python基础找茬系列20--python函数的秘密
  8. 【转】Vue.js入门教程(二)在页面中引入vue的方式
  9. 2030年春节,你会跟机器人一起过吗?
  10. 奥运奖牌计数(信息学奥赛一本通-T1064)
  11. Centos/Linux下如何查看网关地址/Gateway地址
  12. 二叉树最小单元结点的实现
  13. HyperLedger/Fabric JAVA-SDK with 1.1
  14. 产品经理改需求这件事
  15. 版权符号圈c的输入方法
  16. Vim实用技巧_7.模式匹配和查找
  17. Extracting Multiple-Relations in One-Pass with Pre-Trained Transformers [论文研读]
  18. Arcgis中topolopy(摘自网络)
  19. “您希望继续执行吗? [Y/n] y 中止。”
  20. 洞洞板上的TQFP芯片的焊接模式

热门文章

  1. C++之new再探究
  2. python itchat 无法登录_项目分享|5步教你用Python制作朋友圈个性签名
  3. tensorflow中同时两个损失函数_深度度量学习中的损失函数
  4. linux rdma服务,在Linux中infiniband rdma差转转bw
  5. mysql group b_mysql报错之5.7版本的 group by mysql不能使用group by
  6. linux db2表空间目录,db2 表空间的一些知识
  7. android 获取已安装应用的安装包,Android获取设备已安装的应用
  8. html 倒计时字体消失,最简单的一个网页倒计时代码 时间到期后会显示出提醒内容 收藏版...
  9. java 数据库操作教程_数据库基本操作:增删改查及联表操作
  10. dcdc芯片效率不高的原因_电动汽车DCDC变换器应用详解