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.单例类必须自己自己创建自己的唯一实例. ...
随机推荐
- SpringCloud系列——Bus 消息总线
前言 SpringCloud Bus使用轻量级消息代理将分布式系统的节点连接起来.然后可以使用此代理广播状态更改(例如配置更改)或其他管理指令.本文结合RabbitMQ+GitHub的Webhook实 ...
- 第四章:shiro的INI配置
4.1 根对象SecurityManager 从之前的Shiro架构图可以看出,Shiro是从根对象SecurityManager进行身份验证和授权的:也就是所有操作都是自它开始的,这个对象是线程安全 ...
- 包(package)以及面向对象三个基本特征(继承)的介绍
1.包(package) 包(package) 用于管理程序中的类,主要用于解决类的同名问题.包也可以看成一个目录. 包的作用 [1] 防止命名冲突. [2] 允许类组成一个单元(模块),便于管理和维 ...
- IDEA 安装配置可视化 MongDB 插件
IDEA 安装配置可视化 MongDB 插件 1.安装MongoDB插件 打开 IDEA ,file --> settings --> plugins,在右边搜索栏中输入Mongo,点击 ...
- 定义工作,解读自我——IT帮2019年2月线下活动回顾
本次活动是在北京和深圳两个分站同步进行的,IT团建委员会负责策划和组织,北京站由帮主周老师.王兵老师主导,深圳站由副帮主兼深圳站长陈焕老师主导. 几位老师都是有着丰富的工作经历和人生体验的导师,他们不 ...
- Greedy分饼干
分饼干:因为饼干大小和孩子的食欲度不一定是按大小顺序排列的,所以开始要排序一下,然后从最小的饼干依次从食欲小的孩子开始看,如果他愿意吃,就++,看下一个小孩子,这回拿的就是大一点的饼干了. Examp ...
- js 发送短信倒计时、秒杀倒计时实现代码
<!doctype html> <html> <head> <meta charset="utf-8"> <meta name ...
- 教程一 openwrt路由器入门 远程命令行+文件系统
如图,拿到一个openwrt路由器我们第一步要远程控制. 这里在买了两块wifi-robots wifi视频模块. 0首先说下这个WIIF的信息 淘宝购买链接 https://item.taobao ...
- Oracle 11g全表扫描以Direct Path Read方式执行
在Oracle Database 11g中有一个新特性,全表扫描可以通过直接路径读的方式来执行(Direct Path Read),这是一个合理的变化,如果全表扫描的大量数据读取是偶发性的,则直接路径 ...
- 多态练习题(通过UML建模语言来实现饲养员喂养动物)
项目需求如下图: package com.Summer_0428.cn; /** * @author Summer * 1.构建一个食物抽象类,Bone和Fish分别为其实现类,通过super传参. ...