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.单例类必须自己自己创建自己的唯一实例. ...
随机推荐
- HeadFirst设计模式读书笔记之工厂模式
1. 简单工厂 1. 你开了一家披萨店,点披萨的方法可能是这样: public Pizza orderPizza(String type) { Pizza pizza; if (type.equals ...
- 用Gogs在Windows上搭建Git服务
1.下载并安装Git,如有需求,请重启服务器让Path中的环境变量生效. 2.下载并安装Gogs,请注意,在Windows中部署时,请下载MiniWinService(mws)版本. 3.在Maria ...
- 学习安卓开发[5] - HTTP、后台任务以及与UI线程的交互
在上一篇学习安卓开发[4] - 使用隐式Intent启动短信.联系人.相机应用中了解了在调用其它应用的功能时隐式Intent的使用,本次基于一个图片浏览APP的开发,记录使用AsyncTask在后台执 ...
- Android探究之Gson@SerializedName
@SerializedName注解的意义 当我们使用Gson解析Json数据时都会创建一个对应实体类,有时候Json数据里面的字段是Java关键词或者Json数据里面的字段太简单,我们想在实体类中自定 ...
- hbase 预分区与自动分区
我们知道,HBASE在创建表的时候,会自动为表分配一个Region,当一个Region过大达到默认的阈值时(默认10GB大小),HBase中该Region将会进行split,分裂为2个Region,以 ...
- emacs 只读打开文件
emacs 只读打开文件 : C-x C-r emacs 让buffer区变成只读 : C-x C-q emacs 让只读buffer区变成可以保存修改 : C-x C-q
- windows压缩图片
- firewalld防火墙设置
CentOS7/RHEL7系统默认的iptables管理工具是firewalld,不再是以往的iptables-services,命令用起来也是不一样了,当然你也可以选择卸载firewalld,安装i ...
- wifi扫描
获取当前位置的wifi,信道,强度,mac #include "ESP8266WiFi.h" IPAddress apIP(192, 168, 4, 1); void setup( ...
- matlab函数int2str, num2str, str2num
函数名:int2str 功能:将整数值转换为字符串 输入格式:str = int2str(N) 备注:就将该值四舍五入后转换为字符串,接受向量和矩阵输入. 如果是向量和矩阵输入,列数字之间会补加两个空 ...