Java单例模式的实现
单例的实现
单例设计模式的问题
1. 线程安全问题用synchronized修饰实例化部分代码
2. 性能问题–采用懒汉式实例化
3. 指令重排序问题–用volatile修饰实例
4. 反序列化攻击问题–构造函数判断存在实例时抛异常
5. 反射攻击问题–增加readResolve方法
6. 不符合开闭原则,需要改代码
五种单例实现方式
1. 饿汉式
package me.muphy.singleton; import java.io.Serializable; /**
* 2019/4/1
* 莫非
*/
public class HungrySingleton implements Serializable{ private static final HungrySingleton hungrySingleton = new HungrySingleton(); private HungrySingleton() { } public static HungrySingleton getInstance() {
return hungrySingleton;
} private ObjectreadResolve() {
return hungrySingleton;
} }
2. 懒汉式延时加载方式
package me.muphy.singleton; /**
* 2019/4/1
* 莫非
*/
public class LazySingleton { private volatile static LazySingleton lazySingleton = null; private LazySingleton() {
if (lazySingleton != null) {
throw new RuntimeException("此类以单例存在!");
}
} public static LazySingleton getInstance() throws Exception {
if (lazySingleton == null) {
synchronized (LazySingleton.class) {
if (lazySingleton == null) {
lazySingleton = new LazySingleton();
}
}
}
return lazySingleton;
} private Object readResolve() {
return lazySingleton;
} }
3. 懒汉式 内部内实现单例
package me.muphy.singleton; /**
* 2019/4/1
* 莫非
*/
public class LazyJvmSingleton { private LazyJvmSingleton(){ } public static LazyJvmSingleton getInstance(){
return LazySingleton.lazyJvmSingleton;
} private static class LazySingleton{
public static final LazyJvmSingleton lazyJvmSingleton = new LazyJvmSingleton();
} private Object readResolve(){
return LazySingleton.lazyJvmSingleton;
}
}
4. 注册式 枚举式单例
package me.muphy.singleton; /**
* 2019/4/1
* 莫非
*/
public enum EnumSingleton {
INSTANCE; private Object data; public Object getData() {
return data;
} public void setData(Object data) {
this.data = data;
} public static EnumSingleton getInstance() {
return INSTANCE;
}
}
5. 注册式 容器式单例
package me.muphy.singleton; import java.util.Map;
import java.util.concurrent.ConcurrentHashMap; /**
* 2019/4/1
* 莫非
*/
public class ContainerSingleton {
private ContainerSingleton() {
} private static Map<String, Object> ioc = new ConcurrentHashMap<>(); public static Object getBean(String className) {
synchronized (ioc) {
if (!ioc.containsKey(className)) {
try {
Object obj = Class.forName(className).newInstance();
ioc.put(className, obj);
return obj;
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
}
} return ioc.get(className);
}
}
线程内部的单例
线程内部的单例采用注册式单例,是伪线程安全的,可用来实现多数据源切换
package me.muphy.singleton; /**
* 2019/4/2
* 莫非
*/
public class ThreadLocalSingleton { private ThreadLocalSingleton() {
} private static final ThreadLocal<ThreadLocalSingleton> threadLocalInstance =
new ThreadLocal<ThreadLocalSingleton>() { @Override
protected ThreadLocalSingleton initialValue() {
return new ThreadLocalSingleton();
}
}; public static ThreadLocalSingleton getInstance() {
return threadLocalInstance.get();
}
}
Java单例模式的实现的更多相关文章
- 用java单例模式实现面板切换
1.首先介绍一下什么是单例模式: java单例模式是一种常见的设计模式,那么我们先看看懒汉模式: public class Singleton_ { //设为私有方法,防止被外部类引用或实例 priv ...
- 【深入】java 单例模式(转)
[深入]java 单例模式 关于单例模式的文章,其实网上早就已经泛滥了.但一个小小的单例,里面却是有着许多的变化.网上的文章大多也是提到了其中的一个或几个点,很少有比较全面且脉络清晰的文章,于是,我便 ...
- 深入Java单例模式(转)
深入Java单例模式 源自 http://devbean.blog.51cto.com/448512/203501 在GoF的23种设计模式中,单例模式是比较简单的一种.然而,有时候越是简单的东西越容 ...
- Java 单例模式的七种写法
Java 单例模式的七种写法 第一种(懒汉,线程不安全) public class Singleton { private static Singleton instance; private Sin ...
- java单例模式之懒汉式分析
转自:http://blog.csdn.net/withiter/article/details/8140338 今天中午闲着没事,就随便写点关于Java单例模式的.其实单例模式实现有很多方法,这里我 ...
- Java 单例模式探讨
以下是我再次研究单例(Java 单例模式缺点)时在网上收集的资料,相信你们看完就对单例完全掌握了 Java单例模式应该是看起来以及用起来简单的一种设计模式,但是就实现方式以及原理来说,也并不浅显哦. ...
- 单例模式:Java单例模式的几种写法及它们的优缺点
总结下Java单例模式的几种写法: 1. 饿汉式 public class Singleton { private static Singleton instance = new Singleton( ...
- 9种Java单例模式详解(推荐)
单例模式的特点 一个类只允许产生一个实例化对象. 单例类构造方法私有化,不允许外部创建对象. 单例类向外提供静态方法,调用方法返回内部创建的实例化对象. 懒汉式(线程不安全) 其主要表现在单例类在外 ...
- 你真的理解了java单例模式吗?讲别人都忽略的细节!
前言:老刘这篇文章敢做保证,java的单例模式讲的比大多数的技术博客都要好,讲述别人技术博客都没有的细节!!! 1 java单例模式 直接讲实现单例模式的两种方法:懒汉式和饿汉式,单例模式的概念自己上 ...
- Java 单例模式详解
概念: java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例.饿汉式单例.登记式单例三种. 单例模式有一下特点: 1.单例类只能有一个实例. 2.单例类必须自己自己创建自己的唯一实例. ...
随机推荐
- ASCII Art ヾ(≧∇≦*)ゝ
Conmajia, 2012 Updated on Feb. 18, 2018 What is ASCII art? It's graphic symbols formed by ASCII char ...
- 简简单单的Vue1(MVVM与Vue的双向绑定原理)
既然选择了远方,便只顾风雨兼程 __ HANS许 系列:零基础搭建前后端分离项目 系列:零基础搭建前后端分离项目 Vue 在此之前的文章我们讲述了前端开发的工具,语言的知识,接下来我们从头开始学习一个 ...
- javascript面向对象习题答案
第二章 1.如果我们在控制台中执行下列语句,结果分别是什么?为什么? var a; typeof a; undefined > var s = '1s'; s++; NaN > !!&qu ...
- Android项目实战(五十二):控制EditText输入内容大小写转换
今日需求,EditText内容为一串字符串,要求将用户软键盘输入的小写字母在输入的时候自动转为大写字母,反之亦然. 效果如下: 第一次做该需求,原先想法: EditText.addTextChange ...
- Android ble蓝牙使用注意
以下均为自己在Android ble开发项目中遇到的问题 1.尽量不要在BluetoothGattCallback里面的回调函数中执行读写通知操作,最多一个,因为例如在onServicesDiscov ...
- Android远程桌面助手(B1332)之文件管理器
Android远程桌面助手除了支持Android界面的显示及控制外,还支持Android文件系统的管理,包括文件的快速上传(push).下拉(pull)和查看(cat). Android远程桌面助手( ...
- WPF:浅析Dispatcher
本人文笔差.还是直接上代码吧.(本文假设你对WPF中的Dispatcher有一定的了解) 你觉得下面的代码可以正常执行吗? private void Button_Click(object sende ...
- linux下mysql区分大小写的内容
1.数据库名严格区分大小写2.表名严格区分大小写的3.表的别名严格区分大小写4.变量名严格区分大小写5.列名在所有的情况下均忽略大小写6.列的别名在所有的情况下均忽略大小写
- mysql之limit使用
在mysql中,limit的使用方式如下: limit m,n --m:表示从哪一行开始查,n:查询多少条 需要明确的是,m表示取条数的起始位置,而n表示取多少条.例如我查询某个表,获取第一条数据,那 ...
- Zabbix3.4-RHEL 7.4 X64 YUM联网安装
OS准备 关闭selinux vi /etc/selinux/config setenforce 0 开启防火墙80端口访问 firewall-cmd --permanent --add-rich-r ...