java 单例模式实现的5种方式
第一种:饿汉式
/*** Created with IntelliJ IDEA.** @author: 宸濯* Date: 2021/08/18 8:21* Description:单例模式的设计(饿汉式)* 1.构造方法私有化* 2.在静态语句块实例化* 3.提供调用实例对象的方法* 4.空间换时间,不管有没有调用方法,实例都创建了* Version: V1.0*/
public class SingletonOne {private static final int THREADS=100;private static SingletonOne instance;/*** 构造方法私有化*/private SingletonOne(){}static {instance=new SingletonOne();}public static SingletonOne getInstance(){return instance;}public static void main(String[] args) {for (int i=0;i<THREADS;i++){new Thread(()-> System.out.println(getInstance().hashCode())).start();}}
}
第二种:懒汉式
/*** Created with IntelliJ IDEA.* @author: 宸濯* Description:单例模式设计(懒汉式)* 1.构造方法私有化* 2.在调用时判断是否实例化* 3.时间换空间,调用方法时创建实例对象*/
public class SingletonTow {private static SingletonTow instance;private static final int THREADS=100;private SingletonTow(){}public static SingletonTow getInstance(){if (instance==null){instance=new SingletonTow();}return instance;}public static void main(String[] args) {for (int i=0;i<THREADS;i++){new Thread(()-> System.out.println(getInstance().hashCode())).start();}}
}
第三种:双检锁式
/*** Created with IntelliJ IDEA.* @author: 宸濯* Description:单例模式设计(双检锁懒汉式)* 1.构造方法私有化* 2.在调用时判断是否实例化* 3.时间换空间,调用方法时创建实例对象*/
public class SingletonTow {/*** volatile修饰符防止指令重排序*/private static volatile SingletonTow instance;private static final int THREADS=100;private SingletonTow(){}public static SingletonTow getInstance(){if (instance==null){synchronized (SingletonTow.class){//双重判定,防止高并发,不过会导致指令重排序if (instance==null){instance=new SingletonTow();}}}return instance;}public static void main(String[] args) {for (int i=0;i<THREADS;i++){new Thread(()-> System.out.println(getInstance().hashCode())).start();}}
}
java并发编程:volatile关键字解析
第四种:静态内部类式
/*** Created with IntelliJ IDEA.** @author: 宸濯* Description:设计单例模式* 1.构造方法私有化* 2.静态内部类实例化对象* 3.静态内部类只会被加载一次,类加载的初始化阶段是单线程的,没有高并发带来的冲突*/
public class SingletonThree {/*** 声明线程数*/private static final int THREADS=100;private static class Inner{private static final SingletonThree INSTANCE=new SingletonThree();}private SingletonThree(){}public static SingletonThree getInstance(){return Inner.INSTANCE;}public static void main(String[] args) {for (int i=0;i<THREADS;i++){new Thread(()-> System.out.println(SingletonThree.getInstance().hashCode())).start();}}
}
第五种:枚举类型
/*** Created with IntelliJ IDEA.* @author : 宸濯*/
public enum SingletonFour {//枚举类型设计单例模式SINGLETON_FOUR;public void test(){System.out.println("hello world");}}public class Main {public static void main(String[] args) {SingletonFour.SINGLETON_FOUR.test();}
}
java 单例模式实现的5种方式相关推荐
- 12月18日云栖精选夜读 | Java 中创建对象的 5 种方式!...
作为Java开发者,我们每天创建很多对象,但我们通常使用依赖管理系统,比如Spring去创建对象.然而这里有很多创建对象的方法,我们会在这篇文章中学到. Java中有5种创建对象的方式,下面给出它们的 ...
- Java中创建对象的几种方式
Java中创建对象的几种方式 1.使用new创建对象,在堆上创建. 2.克隆 3.反序列化 4.反射创建对象 5.NIO中可以使用本地方法直接分配堆外内存. 转载于:https://www.cnblo ...
- Java中创建对象的四种方式
为什么80%的码农都做不了架构师?>>> Java中创建对象的四种方式 (1) 用new语句创建对象,这是最常见的创建对象的方法. (2) 运用反射手段,调用java.l ...
- java解析xml的几种方式
java解析xml的几种方式 博客分类: java基础备忘-好记性不然烂笔头 XMLJava应用服务器数据结构编程 第一种:DOM. DOM的全称是Document Object Model,也即文 ...
- 创建和应用Java包文件的两种方式(转)
创建和应用Java包文件的两种方式(转) <Java编程艺术>章节选登.作者:高永强 清华大学出版社 (即将出版) 12.1 包--package ... 12.1.1 包命名规 ...
- java制作oracle程序,Java程序操作Oracle两种方式之简单实现
Java程序操作Oracle两种方式之简单实现 1.通过JDBC-ODBC桥连接Oracle数据库 (1)创建odbc源,在控制面板->管理工具->数据源(odbc)中添加DSN,比如取名 ...
- java 复制文本内容_基于java文本复制的7种方式总结
如下所示: package copy; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import ...
- Java字符串连接的几种方式
Java字符串连接的几种方式 字符串表现的几种方式 StringBuffer和StringBuilder及String的继承关系 字符串的连接 1.String的连接方法 可以看出连接方式是新建了一个 ...
- Java 实现抽奖的两种方式
Java实现抽奖的两种方式 方式一:随机数在哪个区间内返回区间下标 方式二:随机数加入区间点集合排序返回随机数下标 代码示例: ①抽奖入参类型为BigDecimal: package com.cfay ...
- Java解析Xml的三种方式总结
转自:http://blog.csdn.net/zjf280441589/article/details/50613881 XML解析技术有两种 DOM SAX DOM方式 根据XML的层级结构在内 ...
最新文章
- 腾讯的电商,在东南亚击败了阿里巴巴
- AtomicInteger
- Tornado源码分析 --- 静态文件处理模块
- Asp程序做页面的301跳转,使得cnasda.com跳转到www.cnasda.com
- solr创建索引_Solr:创建拼写检查器
- golang学习和使用经验总结
- Linux查看和修改IP地址
- 软考-嵌入式系统设计师-笔记:嵌入式系统的项目开发与维护
- Hive 动态分区恢复静态分区表数据
- 小鸟云服务器如何通过本地安全策略阻止IP访问?
- 编程达人教你如何快速掌握一门编程语言附技术书阅读方法论
- 更改设置让Cheat Engine搜索安卓模拟器里的数据
- 『Python核心技术与实战』pandas.DataFrame()函数介绍
- iview 表格合并行
- uni-app使用Hbuilder X如何安卓APP打包、发布、运行
- 数据库与身份认证:在项目中操作 MySQL
- 转发保留不错一篇 数学模型神经网络在程序化交易模型构建中的运用探讨
- 【exe4j】如何利用exe4j把java桌面程序生成exe文件
- java线程知识总结
- 由年化收益率一词引申出的投资理财想法和公式