【学亮说】Java实现单例模式的8种方式(你真的搞懂单例模式了吗?)
第一种:饿汉式单例模式
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种方式(你真的搞懂单例模式了吗?)相关推荐
- python实现单例模式的几种方式_基于Python中单例模式的几种实现方式及优化详解...
单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. ...
- python实现单例模式的三种方式及相关知识解释
python实现单例模式的三种方式及相关知识解释 模块模式 装饰器模式 父类重写new继承 单例模式作为最常用的设计模式,在面试中很可能遇到要求手写.从最近的学习python的经验而言,singlet ...
- 12月18日云栖精选夜读 | Java 中创建对象的 5 种方式!...
作为Java开发者,我们每天创建很多对象,但我们通常使用依赖管理系统,比如Spring去创建对象.然而这里有很多创建对象的方法,我们会在这篇文章中学到. Java中有5种创建对象的方式,下面给出它们的 ...
- java解析xml的几种方式
java解析xml的几种方式 博客分类: java基础备忘-好记性不然烂笔头 XMLJava应用服务器数据结构编程 第一种:DOM. DOM的全称是Document Object Model,也即文 ...
- 最优雅的Java字符串拼接是哪种方式?
title shortTitle category tag description head 最优雅的Java字符串拼接是哪种方式? Java字符串拼接 Java核心 数组&字符串 Java程 ...
- Java中创建对象的几种方式
Java中创建对象的几种方式 1.使用new创建对象,在堆上创建. 2.克隆 3.反序列化 4.反射创建对象 5.NIO中可以使用本地方法直接分配堆外内存. 转载于:https://www.cnblo ...
- Java中创建对象的四种方式
为什么80%的码农都做不了架构师?>>> Java中创建对象的四种方式 (1) 用new语句创建对象,这是最常见的创建对象的方法. (2) 运用反射手段,调用java.l ...
- 创建和应用Java包文件的两种方式(转)
创建和应用Java包文件的两种方式(转) <Java编程艺术>章节选登.作者:高永强 清华大学出版社 (即将出版) 12.1 包--package ... 12.1.1 包命名规 ...
- java制作oracle程序,Java程序操作Oracle两种方式之简单实现
Java程序操作Oracle两种方式之简单实现 1.通过JDBC-ODBC桥连接Oracle数据库 (1)创建odbc源,在控制面板->管理工具->数据源(odbc)中添加DSN,比如取名 ...
最新文章
- 储能系统进入数据中心是大势所趋
- Linux 虚拟机安装后的配置和一些命令符笔记
- SVN使用和解决方案
- html布局基础,HTML 布局 - HTML 基础教程
- node.js stream
- [多线程系列]多线程之java线程池架构分析
- 找到的The LEGEND of the DRAGON的新下载地址
- ps切图导出html,ps网页切图-如何用PS切图和输出网页
- 手机显示无法接通服务器怎么办,手机无法接通是什么原因及如何解决【图文】...
- 吴恩达 深度学习 2021版 作业
- spring注解原理:从Controller注解切入了解spring注解原理
- duxcms1.0 默认主题分析
- 数据库sql语句日期查询
- 检测本地连接并自动连接宽带连接.cmd
- java计算工作日_java计算工作时间除去节假日以及双休日
- 计算机二级怎么复习,全国计算机等级考试应该如何备考
- 数学建模02 —— 多属性决策模型
- 滴水穿石 C#中多线程 委托的使用
- char*data和char data[]
- 下载安装dingding