以下代码是最普通的双重锁的单例实现形式

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(破坏单例)的更多相关文章

  1. Java中反射和Unsafe破坏单例设计模式

    有如下单例模式设计代码: class Singleton { private String info = "HELLO SHIT"; private static Singleto ...

  2. java设计模式—单例模式(包含单例的破坏)

    什么是单例模式? 保证一个了类仅有一个实例,并提供一个访问它的全局访问点. 单例模式的应用场景? 网站的计数器,一般也是采用单例模式实现,否则难以同步: Web应用的配置对象的读取,一般也应用单例模式 ...

  3. java单例-积木系列

    一步步知识点归纳吧,把以前似懂非懂,了解表面,知道点不知道面的知识归一下档.   懒汉式单例: 私有化构造函数,阻止外界实例话对象,调用getInstance静态方法,判断是否已经实例化. 为什么是懒 ...

  4. Effective java 第2版 - 笔记(01) 单例(Singleton)的枚举(enum)实现

    直接上代码: public enum Boss { INSTANCE; private String name; public void doSomeThing() { System.out.prin ...

  5. java单例之enum实现方式

    传统的两私有一公开(私有构造方法.私有静态实例(懒实例化/直接实例化).公开的静态获取方法)涉及线程安全问题(即使有多重检查锁也可以通过反射破坏单例), 目前最为安全的实现单例的方法是通过内部静态en ...

  6. 【工作中学习1】两个设计模式:Singleton(单例)和 Adapter(适配器)

    好久没有写自己的学习小博客,罪过罪过..最近本菜鸟在项目中接触到经常用到的设计模式,首先是Singleton(单例),这个相信大家都会用到很多,所以自己用代码实现一下,有助于自己学习理解,如有不对,请 ...

  7. Java设计模式:Singleton(单例)模式

    概念定义 Singleton(单例)模式是指在程序运行期间, 某些类只实例化一次,创建一个全局唯一对象.因此,单例类只能有一个实例,且必须自己创建自己的这个唯一实例,并对外提供访问该实例的方式. 单例 ...

  8. 十次艳遇单例设计模式(Singleton Pattern)

    1.引言 单例设计模式(Singleton Pattern)是最简单且常见的设计模式之一,在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访 ...

  9. 再看 Java 中的单例

    此前面试遇到了单例问题,本以为已经背的滚瓜烂熟,没想到被问单例如何避免被反射和序列化破坏,虽然后来还是等到了通知,但还是复习一下单例的实现方式,并学习防止反射和序列化破坏的手段. 基本实现方式 其他相 ...

随机推荐

  1. 足球动图gif(二)

  2. 【Python学习笔记五】re.findall()方法中,正则的"()"效果

    在笔记四中,使用正则去筛选数据时,使用了findall()这个方法,在使用时正则表达式中使用了到了"()",最初以为只是强调执行优先级,后来发现正则表达式中的每一个(),在find ...

  3. MapReduce之自定义分区器Partitioner

    @ 目录 问题引出 默认Partitioner分区 自定义Partitioner步骤 Partition分区案例实操 分区总结 问题引出 要求将统计结果按照条件输出到不同文件中(分区). 比如:将统计 ...

  4. socket链接

    服务端: package com.batch.service.impl; import java.io.BufferedReader; import java.io.BufferedWriter; i ...

  5. Day15_用户注册

    学于黑马和传智播客联合做的教学项目 感谢 黑马官网 传智播客官网 微信搜索"艺术行者",关注并回复关键词"乐优商城"获取视频和教程资料! b站在线视频 0.学习 ...

  6. Python列表脚本操作符

    Python列表脚本操作符: len(列表名): 查看列表长度 # 使用 len(列表名) 方法查看列表长度 lst = [1,2,3,4] print(len(lst)) # # 注:嵌套列表算一个 ...

  7. Python元组运算符

    Python元组运算符: len(元组名): 返回元组对象的长度 # len(元组名): # 返回元组对象的长度 tuple_1 = (1,4,5,2,3,6) print(len(tuple_1)) ...

  8. PHP localtime() 函数

    ------------恢复内容开始------------ 实例 以一个数值数组和一个关联数组的形式输出本地时间: <?phpprint_r(localtime());echo "& ...

  9. navicat for mysql 连接报错1251的解决方法

    这是因为比较新的mysql版本采用新的保密方式,若要用navicat连接需要改使用到的用户的密码方式:use mysql:ALTER USER 'root'@'localhost' IDENTIFIE ...

  10. win10 安装tensorflow2.0 GPU版本遇到的坑

          背景:我的机器上tensorflow 1.14 & 2.0,这俩版本都有,之前都是用1.14版本,今天试一下2.0尝尝鲜, 结果就掉坑去了 把CUDA10.1 和 cudnn 安装 ...