JAVA设计模式之单例(singleton)
一、饿汉式
/**
* 饿汉式
*/
public class Singleton01 { private static final Singleton01 instance = new Singleton01(); private Singleton01(){} public static Singleton01 getInstance(){
return instance;
} public static void main(String[] args) {
System.out.println(Singleton01.getInstance().hashCode());
System.out.println(Singleton01.getInstance().hashCode());
}
}
二、懒汉式
/**
* 懒汉式
*/
public class Singleton02 { private static Singleton02 instance; private Singleton02(){} public static Singleton02 getInstance(){
if(instance == null){
instance = new Singleton02();
}
return instance;
} public static void main(String[] args) {
System.out.println(Singleton02.getInstance().hashCode());
System.out.println(Singleton02.getInstance().hashCode());
}
}
三、懒汉式线程不安全测试
/**
* 懒汉式 线程不安全测试
*/
public class Singleton03 { private static Singleton03 instance;
private static Object obj = new Object(); private Singleton03(){} public static Singleton03 getInstance(){ if(instance == null){
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
instance = new Singleton03(); }
return instance;
} public static void main(String[] args) {
for(int i = 0; i< 100;i++) {
new Thread (() ->{
System.out.println(Singleton03.getInstance().hashCode());
}).start();
}
}
}
四、懒汉式线程安全写法(坑),并不能保证线程安全
/**
* 懒汉式 线程不安全
*/
public class Singleton03 { private static Singleton03 instance; private Singleton03(){} public static Singleton03 getInstance(){ if(instance == null){
synchronized (Singleton03.class) {
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
instance = new Singleton03();
}
}
return instance;
} public static void main(String[] args) {
for(int i = 0; i< 100;i++) {
new Thread (() ->{
System.out.println(Singleton03.getInstance().hashCode());
}).start();
}
}
}
5、懒汉式线程安全写法DCL,必须添加volatile关键字防止指令重排序
/**
* 懒汉式 线程安全
*/
public class Singleton04 { private static volatile Singleton04 instance; private Singleton04(){} public static Singleton04 getInstance(){ if(instance == null){
synchronized (Singleton04.class) {
if(instance == null){
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
instance = new Singleton04();
}
}
}
return instance;
} public static void main(String[] args) {
for(int i = 0; i< 100;i++) {
new Thread (() ->{
System.out.println(Singleton04.getInstance().hashCode());
}).start();
}
}
}
6、单例模式静态内部类实现
/**
* 静态内部类实现 线程安全
*/
public class Singleton05 { private Singleton05(){} private static class SingletonHolder {
private static final Singleton05 instance = new Singleton05();
} public static Singleton05 getInstance(){
return SingletonHolder.instance;
} public static void main(String[] args) {
for(int i = 0; i< 100;i++) {
new Thread (() ->{
System.out.println(Singleton05.getInstance().hashCode());
}).start();
}
}
}
7、终极实现之枚举类,Joshua Bloch 的《effective java》中推荐写法,防止反射和反序列化并且线程安全
/**
* 枚举类实现 线程安全
*/
public enum Singleton06 { instance;
public static void main(String[] args) {
for(int i = 0; i< 100;i++) {
new Thread (() ->{
System.out.println(Singleton06.instance.hashCode());
}).start();
}
}
}
JAVA设计模式之单例(singleton)的更多相关文章
- Java设计模式之 — 单例(Singleton)
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/8860649 写软件的时候经常需要用到打印日志功能,可以帮助你调试和定位问题,项目上 ...
- Java设计模式之单例
一.Java中的单例: 特点: ① 单例类只有一个实例 ② 单例类必须自己创建自己唯一实例 ③ 单例类必须给所有其他对象提供这一实例 二.两种模式: ①懒汉式单例<线程不安全> 在类加载时 ...
- [译]Java 设计模式之单例
(文章翻译自Java Design Pattern: Singleton) 单例是在Java最经常被用到的设计模式.它通过阻止其他的实例化和修改来用于控制创建对象的数目.这一特性可应用于那些当只有一个 ...
- java设计模式_单例
public class Singleton { public static void main(String[] args) throws Exception { System.out.printl ...
- JAVA设计模式:单例设计
1.单例设计Singleton的引出 单例设计,从名字上首先可以看出单---即只有一个,例---只的是实例化对象:那么单例也就是说一个类,只产生了一个实例化对象.但是我们都知道,一个类要产生实例化对象 ...
- java设计模式之单例设计模式和多例设计模式
单例设计模式:构造方法私有化,在类的内部定义static属性和方法,利用static方法来取得本类的实例化对象:无论外部产生多少个实例化对象,本质上只有一个实例化对象 饿汉式单例设计 class Si ...
- JAVA中实现单例(Singleton)模式的八种方式
单例模式 单例模式,是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例.即一个类只有一个对象实例. 基本的实现思路 单 ...
- Java设计模式之单例设计模式总结
package singleton; /**单例设计模式 饿汉式 * * @author gx *这种方式基于classloder机制避免了多线程的同步问题,不过,instance在类装载时就实例化, ...
- java设计模式之单例设计模式
单例设计模式 保证一个类在使用过程中,只有一个实例.优势就是他的作用,这个类永远只有一个实例. 优势:这个类永远只有一个实例,占用内存少,有利于Java垃圾回收. 单例设计模式关键点 私有的构造方法. ...
随机推荐
- 动态规划_01背包_从Dijikstra和Floyd入手,彻底理解01背包
dp一直是短板,现在从最基础的地方开始补 给定背包总容量 M ,n个商品选择,分别有价值vi,占量wi,从中取商品放入背包,令.容量和W=Σwi不超过M,令背包中的价值和V=Σvi最大 然后取法有很多 ...
- 深入理解JS原型与原型链
函数的prototype 1.函数的prototype属性 *每个函数都有一个prototype属性,它默认指向一个Object空对象(即称为原型对 象) * 原型对象中都有一个属性construct ...
- c++学习day01基础知识学习
一.代码示例解析: #include <iostream> int main() { using namespace std; cout << "come up an ...
- Python套接字之UDP
目录 基于UDP的socket 发送消息 接收消息 基于UDP的socket 面向无连接的不可靠数据传输,可以没有服务器端,只不过没有服务器端,发送的数据会被直接丢弃,并不能到达服务器端 发送消息 在 ...
- Python刷CSDN阅读数(仅供娱乐)
#!/usr/bin/env python # -*- coding: utf-8 -*- """ @File:csdn_reads.py @E-mail:3649427 ...
- 9. js屏幕截图
html2canvas 该脚本允许您直接在用户浏览器上截取网页或部分网页的“屏幕截图”.屏幕截图基于DOM,因此它可能不是真实表示的100%准确,因为它没有制作实际的屏幕截图,而是根据页面上可用的信息 ...
- javascript: Object对象生成URL参数
code: function makeQuery(queryObject) { const query = Object.entries(queryObject) .reduce((result, e ...
- Java中什么是构造方法
this(...)本类的构造方法super(...)父类的构造方法构造方法:给对象的数据进行初始化格式:A:方法名与类名相同B:没有返回值类型,连void都没有C:没有具体的返回值注意事项:A:如果我 ...
- 漫谈LiteOS-端云互通组件-MQTT开发指南(下)
1.介绍 SDK简介 Agent Tiny是部署在具备广域网能力.对功耗/存储/计算资源有苛刻限制的终端设备上的轻量级互联互通中间件,您只需调用API接口,便可实现设备快速接入到物联网平台以及数据上报 ...
- 高质量动漫实时画质增强器Anime4K在mpv上的配置
Anime4K地址 https://github.com/bloc97/Anime4K mpv地址 https://mpv.io/ 这个要错峰下载,网速不太好 在C盘用户\..\AppData\ ...