一、懒汉式

public class Singleton{private static Singleton instance = null;private Singleton(){}public static Singleton newInstance(){if(null == instance){instance = new Singleton();}return instance;}
}

  懒汉模式中单例是在需要的时候才去创建的,如果单例已经创建,再次调用获取接口将不会重新创建新的对象,而是直接返回之前创建的对象。如果某个单例使用的次数少,并且创建单例消耗的资源较多,那么就需要实现单例的按需创建,这个时候使用懒汉模式就是一个不错的选择。但是这里的懒汉模式并没有考虑线程安全问题,在多个线程可能会并发调用它的getInstance()方法,导致创建多个实例

二、饿汉式

public class Singleton{private static Singleton instance = new Singleton();private Singleton(){}public static Singleton newInstance(){return instance;}
}

  从代码中我们看到,类的构造函数定义为private的,保证其他类不能实例化此类,然后提供了一个静态实例并返回给调用者。饿汉模式是最简单的一种实现方式,饿汉模式在类加载的时候就对实例进行创建,实例在整个程序周期都存在。它的好处是只在类加载的时候创建一次实例,不会存在多个线程创建多个实例的情况,避免了多线程同步的问题。它的缺点也很明显,即使这个单例没有用到也会被创建,而且在类加载之后就被创建,内存就被浪费了。

三、懒汉加锁式

public class Singleton{private static Singleton instance = null;private Singleton(){}public static synchronized Singleton newInstance(){if(null == instance){instance = new Singleton();}return instance;}
}

  加锁的懒汉模式看起来即解决了线程并发问题,又实现了延迟加载,然而它存在着性能问题,依然不够完美。synchronized修饰的同步方法比一般方法要慢很多,如果多次调用getInstance(),累积的性能损耗就比较大了。

四、懒汉双重校验锁

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

1.为了防止new Singleton被执行多次,因此在new操作之前加上Synchronized 同步锁,锁住整个类(注意,这里不能使用对象锁)。

2.进入Synchronized 临界区以后,还要再做一次判空。因为当两个线程同时访问的时候,线程A构建完对象,线程B也已经通过了最初的判空验证,不做第二次判空的话,线程B还是会再次构建instance对象。

3.JVM编译器的指令重排会导致并发问题,所以加入volatile关键字防止指令重排

五、静态内部类

public class Singleton{private static class SingletonHolder{ public static Singleton instance = new Singleton(); } private Singleton(){} public static Singleton newInstance(){ return SingletonHolder.instance; } }

  这种方式同样利用了类加载机制来保证只创建一个instance实例。它与饿汉模式一样,也是利用了类加载机制,因此不存在多线程并发的问题。不一样的是,它是在内部类里面去创建对象实例。这样的话,只要应用中不使用内部类,JVM就不会去加载这个单例类,也就不会创建单例对象,从而实现懒汉式的延迟加载。也就是说这种方式可以同时保证延迟加载和线程安全。

六、枚举

public enum SingletonEnum {INSTANCE;
}

  使用枚举实现的单例模式,不但可以防止利用反射强行构建单例对象,而且可以在枚举类对象被反序列化的时候,保证反序列的返回结果是同一对象。但是枚举模式也是饿汉式,和普通饿汉式存在同样的问题

转载于:https://www.cnblogs.com/JavaZhangXu/p/10065983.html

java 单例模式的几种写法相关推荐

  1. java单例模式的七种写法_Java设计模式之单例模式的七种写法

    什么是单例模式? 单例模式是一种常见的设计模式,单例模式的写法有很多种,这里主要介绍三种: 懒汉式单例模式.饿汉式单例模式.登记式单例 . 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类 ...

  2. Java单例模式的七种写法

    第一种(懒汉,线程不安全): public class Singleton { private static Singleton instance; private Singleton (){} pu ...

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

    Java设计模式之单例模式(七种写法) 第一种,懒汉式,lazy初始化,线程不安全,多线程中无法工作: public class Singleton {private static Singleton ...

  4. Java 实现单例模式的七种写法

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

  5. 【设计模式】各个击破单例模式的8种写法

    单例模式 在一个系统开发过程中,我们在基于节省内存资源.保证数据内容的一致性的考虑上,往往需要对某些类要求只能创建一个实例,即「保证类只有一个实例」的设计模式就是单例模式. 比如我们遇到过的各种Man ...

  6. 使用严格模式的坏处_再见面试官:单例模式有几种写法?

    点击上方"JAVA",星标公众号重磅干货,第一时间送达 饱汉模式 饿汉模式 Holder模式 枚举模式 丑陋但好用的语法糖 总结 " "你知道茴香豆的'茴'字有 ...

  7. Java单例模式的5种实现方法

    一.什么是单例模式 单例模式常用于创建一个全局共享的类实例,即在整个应用程序中只存在一个类实例 二.单例模式的优点和适用场景 优点: 在内存中只有一个对象,节省内存空间 避免频繁的创建销毁对象,可以提 ...

  8. 单例模式的八种写法比较

    转:https://www.cnblogs.com/zhaoyan001/p/6365064.html 单例模式是最常用到的设计模式之一,熟悉设计模式的朋友对单例模式都不会陌生.一般介绍单例模式的书籍 ...

  9. Java单例模式的几种实现方式

    Java单例模式的几种实现方式 在Java 中,单例类只能有一个实例,必须创建自己的唯一实例,单例类必须给所有其他对象提供这一实例.Java 单例模式有很多种实现方式,在这里给大家介绍单例模式其中的几 ...

最新文章

  1. SSKeychain
  2. idea解决activiti(*.bpmn)文件乱码问题。
  3. 【BZOJ1911】【codevs1318】特别行动队,斜率优化DP
  4. sharepoint页面嵌入_在其他系统Iframe中显示SharePoint 页面
  5. bzoj千题计划240:bzoj3900: 交换茸角
  6. 2022电工杯:5G 网络环境下应急物资配送问题(优化)
  7. 计算机终端保密检查 玩游戏,计算机终端保密检查工具(光盘版)
  8. 什么是PoE交换机?PoE交换机与PoE+交换机的区别!
  9. c语言 步进电机 程序,两相5、6线步进电机C语言程序
  10. python简说(二)list
  11. Python turtle库如何瞬间完成作图?难道只难像海龟一样慢慢爬吗?
  12. 浏览器主页被篡改劫持怎么办、主页被劫持的解决办法
  13. android 录屏广播,Android 录屏
  14. OCPC不起量该怎么办?从这四个方面着手,轻松起量
  15. SpringBoot Thymeleaf Vue Mybatis 登录和注册的实现,以及使用Cookie实现七天免登录
  16. samba服务器搭建详细配置
  17. 视频压缩编码和音频压缩编码基本原理
  18. sql语法基础,sql分组查询
  19. 打印设置自定义表尾_打印excel工作表时,如何把表头和表尾一起打印到每一页上?-excle怎样设置表尾打印...
  20. 通信工程专业概述及就业前景分析

热门文章

  1. hbase major_compact 文件会变小吗_图解式学习:可能是最易懂的Hbase架构原理解析(二)...
  2. nano java_java – System.nanoTime()完全无用?
  3. 求cluster的质心坐标
  4. 扫地机自动回充揭秘之小米/iRobot/云鲸/360
  5. 最新型号设备信息对照表_高利洁中央空调风管清洗设备:K11三维度清扫除尘一体机器人...
  6. 限时一个月,拯救三体文明!ETO大数据人才召集计划!
  7. php6 配置,thinkphp6下载安装与配置图文详细讲解教程(composer下载安装)
  8. 查看器_「图」Firefox 70将启用全新证书查看器 允许关闭画中画图标
  9. python go rpc_Python RPC 之 gRPC
  10. python打电话播放语音_让电话录音也能看得见,录音一键转为文字