第一种:饿汉式单例模式

package com.zhangxueliang.dp.sigleton;/*** 饿汉式单例模式* * @Author:Zhang Xueliang* * @Date:2020年3月15日 下午3:39:30*/
public class Zhangxueliang1 {//new一个实例private static Zhangxueliang1 instance= new Zhangxueliang1();//私有化构造器private Zhangxueliang1(){}public static Zhangxueliang1 getInstance() {return instance;}
}

第二种:static代码块创建单例

package com.zhangxueliang.dp.sigleton;/*** 使用static代码块的方式实现饿汉式单例模式* * @Author:Zhang Xueliang* * @Date:2020年3月15日 下午3:35:02*/
public class Zhangxueliang2 {private static Zhangxueliang2 instance=null;private Zhangxueliang2(){}static {instance=new Zhangxueliang2();}public static Zhangxueliang2 getInstance() {return instance;}}

第三种:懒汉式单例模式

package com.zhangxueliang.dp.sigleton;/*** 懒汉式单例模式* * @Author:Zhang Xueliang* * @Date:2020年3月15日 下午3:40:34*/
public class Zhangxueliang3 {private static Zhangxueliang3 instance;private Zhangxueliang3() {}public static Zhangxueliang3 getInstance() {if (instance == null) {//SleepUtil.sleep(1);instance = new Zhangxueliang3();}return instance;}}

第四种:懒汉式+synchronized同步方法

package com.zhangxueliang.dp.sigleton;/*** 懒汉式单例+synchronized同步方法* * @Author:Zhang Xueliang* * @Date:2020年3月15日 下午4:02:29*/
public class Zhangxueliang4 {private static Zhangxueliang4 instance;private Zhangxueliang4() {}public static synchronized Zhangxueliang4 getInstance() {if(instance==null) {SleepUtil.sleep(10);instance = new Zhangxueliang4();}return instance;}
}

第五种:懒汉式 + synchronized同步代码块

package com.zhangxueliang.dp.sigleton;/*** 懒汉式单例 + synchronized同步代码块* * @Author:Zhang Xueliang* * @Date:2020年3月15日 下午4:11:06*/
public class Zhangxueliang5 {private static Zhangxueliang5 instance;private Zhangxueliang5() {}public static Zhangxueliang5 getInstance() {if(instance==null) {SleepUtil.sleep(1);synchronized(Zhangxueliang5.class) {instance = new Zhangxueliang5();}}return instance;}
}

第六种:双重检查double check

package com.zhangxueliang.dp.sigleton;/*** 双重检查* * @Author:Zhang Xueliang* * @Date:2020年3月15日 下午4:25:36*/
public class Zhangxueliang6 {private static volatile Zhangxueliang6 instance;//禁止指令重排private Zhangxueliang6() {}public static Zhangxueliang6 getInstance() {if(instance==null) {SleepUtil.sleep(10);synchronized(Zhangxueliang6.class) {//双重检查if(instance==null) {instance = new Zhangxueliang6();}}}return instance;}
}

第七种:静态内部类方式

package com.zhangxueliang.dp.sigleton;/*** 静态内部类方式实现单例模式* * @Author:Zhang Xueliang* * @Date:2020年3月15日 下午4:29:14*/
public class Zhangxueliang7 {private Zhangxueliang7() {}private static class Zhangxueliang7Holder{private static final Zhangxueliang7 instance=new Zhangxueliang7();}public static Zhangxueliang7 getInstance() {return Zhangxueliang7Holder.instance;}}

第八种:枚举方式创建单例(语法角度堪称完美)

package com.zhangxueliang.dp.sigleton;/*** 语法上是最完美的。可以解决线程同步问题和反序列化(反射)* * @Author:Zhang Xueliang* * @Date:2020年3月15日 下午4:37:13*/
public enum Zhangxueliang8 {instance;
}

线程安全性测试:

package com.zhangxueliang.dp.sigleton;public class TestSigtelon {public static void main(String[] args) {//testEhanSinleton();//testStaticSingleton();//testLanhanSingleton();//testHashcode();//testSynMethod();//testSyncBlock();//testDoubleCheck();//testStaticClass();testEnum();}private static void testEnum() {for (int i = 0; i < 100; i++) {new Thread(()->{System.out.println(Zhangxueliang8.instance.hashCode());}).start();}}/*** 测试静态内部类创建单例*/private static void testStaticClass() {for (int i = 0; i < 100; i++) {new Thread(()->{System.out.println(Zhangxueliang7.getInstance().hashCode());}).start();}}/*** 测试双重检查*/private static void testDoubleCheck() {for (int i = 0; i < 100; i++) {new Thread(()->{System.out.println(Zhangxueliang6.getInstance().hashCode());}).start();}}/*** 懒汉式单例 + synchronized同步代码块*/private static void testSyncBlock() {for (int i = 0; i < 100; i++) {new Thread(()->{System.out.println(Zhangxueliang5.getInstance().hashCode());}).start();}}/*** 测试懒汉式单例+synchronized同步方法*/private static void testSynMethod() {for (int i = 0; i < 100; i++) {new Thread(()->{System.out.println(Zhangxueliang4.getInstance().hashCode());}).start();}}/*** hashCode相同,不一定是同一个对象*/private static void testHashcode() {System.out.println("通话".hashCode());//1179395System.out.println("重地".hashCode());//1179395}/*** 懒汉式单例模式  存在线程安全问题*/private static void testLanhanSingleton() {for (int i = 0; i < 100; i++) {new Thread(()->{System.out.println(Zhangxueliang3.getInstance().hashCode());}).start();}}/*** 测试static代码块单例模式*/private static void testStaticSingleton() {Zhangxueliang2 z1 = Zhangxueliang2.getInstance();Zhangxueliang2 z2 = Zhangxueliang2.getInstance();System.out.println(z2==z1);}/*** 测试饿汉式单例模式*/private static void testEhanSinleton() {Zhangxueliang1 z1 = Zhangxueliang1.getInstance();Zhangxueliang1 z2 = Zhangxueliang1.getInstance();System.out.println(z2==z1);}}

【学亮说】Java实现单例模式的8种方式(你真的搞懂单例模式了吗?)相关推荐

  1. python实现单例模式的几种方式_基于Python中单例模式的几种实现方式及优化详解...

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

  2. python实现单例模式的三种方式及相关知识解释

    python实现单例模式的三种方式及相关知识解释 模块模式 装饰器模式 父类重写new继承 单例模式作为最常用的设计模式,在面试中很可能遇到要求手写.从最近的学习python的经验而言,singlet ...

  3. 12月18日云栖精选夜读 | Java 中创建对象的 5 种方式!...

    作为Java开发者,我们每天创建很多对象,但我们通常使用依赖管理系统,比如Spring去创建对象.然而这里有很多创建对象的方法,我们会在这篇文章中学到. Java中有5种创建对象的方式,下面给出它们的 ...

  4. java解析xml的几种方式

    java解析xml的几种方式 博客分类: java基础备忘-好记性不然烂笔头 XMLJava应用服务器数据结构编程  第一种:DOM. DOM的全称是Document Object Model,也即文 ...

  5. 最优雅的Java字符串拼接是哪种方式?

    title shortTitle category tag description head 最优雅的Java字符串拼接是哪种方式? Java字符串拼接 Java核心 数组&字符串 Java程 ...

  6. Java中创建对象的几种方式

    Java中创建对象的几种方式 1.使用new创建对象,在堆上创建. 2.克隆 3.反序列化 4.反射创建对象 5.NIO中可以使用本地方法直接分配堆外内存. 转载于:https://www.cnblo ...

  7. Java中创建对象的四种方式

    为什么80%的码农都做不了架构师?>>>    Java中创建对象的四种方式 (1) 用new语句创建对象,这是最常见的创建对象的方法.    (2) 运用反射手段,调用java.l ...

  8. 创建和应用Java包文件的两种方式(转)

    创建和应用Java包文件的两种方式(转) <Java编程艺术>章节选登.作者:高永强 清华大学出版社 (即将出版) 12.1  包--package    ... 12.1.1  包命名规 ...

  9. java制作oracle程序,Java程序操作Oracle两种方式之简单实现

    Java程序操作Oracle两种方式之简单实现 1.通过JDBC-ODBC桥连接Oracle数据库 (1)创建odbc源,在控制面板->管理工具->数据源(odbc)中添加DSN,比如取名 ...

最新文章

  1. 储能系统进入数据中心是大势所趋
  2. Linux 虚拟机安装后的配置和一些命令符笔记
  3. SVN使用和解决方案
  4. html布局基础,HTML 布局 - HTML 基础教程
  5. node.js stream
  6. [多线程系列]多线程之java线程池架构分析
  7. 找到的The LEGEND of the DRAGON的新下载地址
  8. ps切图导出html,ps网页切图-如何用PS切图和输出网页
  9. 手机显示无法接通服务器怎么办,手机无法接通是什么原因及如何解决【图文】...
  10. 吴恩达 深度学习 2021版 作业
  11. spring注解原理:从Controller注解切入了解spring注解原理
  12. duxcms1.0 默认主题分析
  13. 数据库sql语句日期查询
  14. 检测本地连接并自动连接宽带连接.cmd
  15. java计算工作日_java计算工作时间除去节假日以及双休日
  16. 计算机二级怎么复习,全国计算机等级考试应该如何备考
  17. 数学建模02 —— 多属性决策模型
  18. 滴水穿石 C#中多线程 委托的使用
  19. char*data和char data[]
  20. 下载安装dingding

热门文章

  1. 【深度学习】CVPR 2021 全部论文链接公布!最新1660篇论文合集!附下载链接
  2. 【Python】100行Python代码轻松开发个人博客
  3. 【机器学习基础】机器学习训练中常见的问题和挑战!
  4. 【Python基础】Python基础语法14个知识点大串讲
  5. 基于geopandas的空间数据分析——空间计算篇(下)
  6. 图解Reformer:一种高效的Transformer
  7. LeetCode_226.翻转二叉树
  8. 《快学 Go 语言》第 7 课 —— 冰糖葫芦串
  9. String.charAT的运用
  10. AL2018届校招笔试——自然语言处理