effectivejava(破坏单例)
以下代码是最普通的双重锁的单例实现形式
package com.edu.character02; import java.io.Serializable; /**
* <p>
* 双重锁
* </P>
*
* @作者 five-five
* @创建时间 2020/8/5
*/
public class SingleTon implements Serializable {
private static SingleTon instance; public static SingleTon getInstance() {
if (instance == null) {
synchronized (SingleTon.class) {
if (instance == null) {
instance = new SingleTon();
}
}
}
return instance;
} private SingleTon() {
}
}
下面是两种破坏单例的方案
1.通过反射的形式
package com.edu.character02; import java.lang.reflect.Constructor; /**
* <p>
* 反射破坏单例
* </p>
*
* @作者 five-five
* @创建时间 2020/8/5
*/
public class DamageSingleTonByReflect {
public static void main(String[] args) throws Exception {
SingleTon s1 = SingleTon.getInstance();
Class<? extends SingleTon> aClass = s1.getClass();
Constructor<? extends SingleTon> constructor = aClass.getDeclaredConstructor();
constructor.setAccessible(true);
SingleTon singleTon = constructor.newInstance();
System.out.println(s1);
System.out.println(singleTon);
System.out.println(s1.hashCode());
System.out.println(singleTon.hashCode());
System.out.println(singleTon == s1);
}
}
测试结果如图:
2.通过序列化的形式
package com.edu.character02; import com.sun.xml.internal.ws.policy.privateutil.PolicyUtils; import java.io.*; /**
* <p>
* 破坏单例
* </p>
* @作者 five-five
* @创建时间 2020/8/5
*/
public class DamageSingleTonBySerializable {
public static void main(String[] args) {
SingleTon s1=null;
SingleTon s2=SingleTon.getInstance();
FileOutputStream fos=null;
ObjectOutputStream oos=null;
FileInputStream fis=null;
ObjectInputStream ois=null;
try {
fos=new FileOutputStream("SingleTon.obj");
oos=new ObjectOutputStream(fos);
oos.writeObject(s2);
oos.flush();
oos.close(); fis=new FileInputStream("SingleTon.obj");
ois = new ObjectInputStream(fis);
s1= (SingleTon) ois.readObject();
ois.close(); System.out.println(s1);
System.out.println(s2);
System.out.println(s1.hashCode());
System.out.println(s2.hashCode());
System.out.println(s1==s2);
} catch (Exception e) {
e.printStackTrace();
}
}
}
测试结果如图:
effectivejava(破坏单例)的更多相关文章
- Java中反射和Unsafe破坏单例设计模式
有如下单例模式设计代码: class Singleton { private String info = "HELLO SHIT"; private static Singleto ...
- java设计模式—单例模式(包含单例的破坏)
什么是单例模式? 保证一个了类仅有一个实例,并提供一个访问它的全局访问点. 单例模式的应用场景? 网站的计数器,一般也是采用单例模式实现,否则难以同步: Web应用的配置对象的读取,一般也应用单例模式 ...
- java单例-积木系列
一步步知识点归纳吧,把以前似懂非懂,了解表面,知道点不知道面的知识归一下档. 懒汉式单例: 私有化构造函数,阻止外界实例话对象,调用getInstance静态方法,判断是否已经实例化. 为什么是懒 ...
- Effective java 第2版 - 笔记(01) 单例(Singleton)的枚举(enum)实现
直接上代码: public enum Boss { INSTANCE; private String name; public void doSomeThing() { System.out.prin ...
- java单例之enum实现方式
传统的两私有一公开(私有构造方法.私有静态实例(懒实例化/直接实例化).公开的静态获取方法)涉及线程安全问题(即使有多重检查锁也可以通过反射破坏单例), 目前最为安全的实现单例的方法是通过内部静态en ...
- 【工作中学习1】两个设计模式:Singleton(单例)和 Adapter(适配器)
好久没有写自己的学习小博客,罪过罪过..最近本菜鸟在项目中接触到经常用到的设计模式,首先是Singleton(单例),这个相信大家都会用到很多,所以自己用代码实现一下,有助于自己学习理解,如有不对,请 ...
- Java设计模式:Singleton(单例)模式
概念定义 Singleton(单例)模式是指在程序运行期间, 某些类只实例化一次,创建一个全局唯一对象.因此,单例类只能有一个实例,且必须自己创建自己的这个唯一实例,并对外提供访问该实例的方式. 单例 ...
- 十次艳遇单例设计模式(Singleton Pattern)
1.引言 单例设计模式(Singleton Pattern)是最简单且常见的设计模式之一,在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访 ...
- 再看 Java 中的单例
此前面试遇到了单例问题,本以为已经背的滚瓜烂熟,没想到被问单例如何避免被反射和序列化破坏,虽然后来还是等到了通知,但还是复习一下单例的实现方式,并学习防止反射和序列化破坏的手段. 基本实现方式 其他相 ...
随机推荐
- 一位Google高管审查了20,000+简历,他发现了这5个致命的错误
工作与生活的平衡 下班划水摸鱼时间,我比较喜欢浏览一下各类新闻网页,比如说ins,这不,我就在ins上看到了这样的一篇文章,内容很简单,就是简历,但是就是这样一份简历,却让这位Google高管震惊不已 ...
- metaspolit下UAC提权以及日志清除
在获得webshell时但权限不够大,这时候为了完全获得受害者机器的权限,使用msf进行后渗透. 一.获取Meterpreter会话 Meterpreter 是msf的一个payload,目标执行之后 ...
- java-把生成的随机数,指定范围(如:100-200),指定打印次数(如:50次),并进行去重。
package main.demo; public class Demo4 { /** * 随机指定范围内N个不重复的数 * 最简单最基本的方法 * @param min 指定范围最小值 * @par ...
- Dubbo的负载均衡算法源码分析
Dubbo提供了四种负载均衡:RandomLoadBalance,RoundRobinLoadBalance,LeastActiveLoadBalance,ConsistentHashLoadBala ...
- springboot+redis做事件过期通知业务
springboot+redis做事件过期通知 博主也是初次体验,不足之处多多指教 我的业务场景 系统管理员要给维护员分配巡查路口设施的工作,由于路口比较多,管理员不知道哪些路口已经被分配了,况且过了 ...
- Typora + PicGo + Gitee 实现图片自动上传到图床
1.下载并安装 Typora (windows版本) https://typora.io/#windows 2.设置图像 文件 -- 偏好设置 -- 图像 3.上步点击下载PicGo(app) 后,去 ...
- Spring Boot 太狠了,一次性发布了 3 个版本!
Spring Boot 太狠了,北京时间 2020/07/25 今天一次性发布了三个主要版本,三条版本线同时更新: Spring Boot 2.3.2 Spring Boot 2.2.9 Spring ...
- Nginx实现JWT验证-基于OpenResty实现
介绍 权限认证是接口开发中不可避免的问题,权限认证包括两个方面 接口需要知道调用的用户是谁 接口需要知道该用户是否有权限调用 第1个问题偏向于架构,第2个问题更偏向于业务,因此考虑在架构层解决第1个问 ...
- bootstrap插件-滚动监听
代码 引入bootstrap.js 和bootstrap.css两个文件 <!DOCTYPE html> <html> <head> <meta charse ...
- smartSVN9.2.2 for mac 安装与破解
原文链接:https://www.jianshu.com/p/bb87154e0459 近段时间使用svn进行项目管理,开始使用的是cornerstone,但是用过程中出现一个操作Bug,一.在xco ...