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

  1. package com.edu.character02;
  2.  
  3. import java.io.Serializable;
  4.  
  5. /**
  6. * <p>
  7. * 双重锁
  8. * </P>
  9. *
  10. * @作者 five-five
  11. * @创建时间 2020/8/5
  12. */
  13. public class SingleTon implements Serializable {
  14. private static SingleTon instance;
  15.  
  16. public static SingleTon getInstance() {
  17. if (instance == null) {
  18. synchronized (SingleTon.class) {
  19. if (instance == null) {
  20. instance = new SingleTon();
  21. }
  22. }
  23. }
  24. return instance;
  25. }
  26.  
  27. private SingleTon() {
  28. }
  29. }

下面是两种破坏单例的方案

1.通过反射的形式

  1. package com.edu.character02;
  2.  
  3. import java.lang.reflect.Constructor;
  4.  
  5. /**
  6. * <p>
  7. * 反射破坏单例
  8. * </p>
  9. *
  10. * @作者 five-five
  11. * @创建时间 2020/8/5
  12. */
  13. public class DamageSingleTonByReflect {
  14. public static void main(String[] args) throws Exception {
  15. SingleTon s1 = SingleTon.getInstance();
  16. Class<? extends SingleTon> aClass = s1.getClass();
  17. Constructor<? extends SingleTon> constructor = aClass.getDeclaredConstructor();
  18. constructor.setAccessible(true);
  19. SingleTon singleTon = constructor.newInstance();
  20. System.out.println(s1);
  21. System.out.println(singleTon);
  22. System.out.println(s1.hashCode());
  23. System.out.println(singleTon.hashCode());
  24. System.out.println(singleTon == s1);
  25. }
  26. }

测试结果如图:

2.通过序列化的形式

  1. package com.edu.character02;
  2.  
  3. import com.sun.xml.internal.ws.policy.privateutil.PolicyUtils;
  4.  
  5. import java.io.*;
  6.  
  7. /**
  8. * <p>
  9. * 破坏单例
  10. * </p>
  11. * @作者 five-five
  12. * @创建时间 2020/8/5
  13. */
  14. public class DamageSingleTonBySerializable {
  15. public static void main(String[] args) {
  16. SingleTon s1=null;
  17. SingleTon s2=SingleTon.getInstance();
  18. FileOutputStream fos=null;
  19. ObjectOutputStream oos=null;
  20. FileInputStream fis=null;
  21. ObjectInputStream ois=null;
  22. try {
  23. fos=new FileOutputStream("SingleTon.obj");
  24. oos=new ObjectOutputStream(fos);
  25. oos.writeObject(s2);
  26. oos.flush();
  27. oos.close();
  28.  
  29. fis=new FileInputStream("SingleTon.obj");
  30. ois = new ObjectInputStream(fis);
  31. s1= (SingleTon) ois.readObject();
  32. ois.close();
  33.  
  34. System.out.println(s1);
  35. System.out.println(s2);
  36. System.out.println(s1.hashCode());
  37. System.out.println(s2.hashCode());
  38. System.out.println(s1==s2);
  39. } catch (Exception e) {
  40. e.printStackTrace();
  41. }
  42. }
  43. }

测试结果如图:

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. two types of friend

    两类朋友 第一类,普通朋友,并不能分享一些隐私的感情,只能说一些事情,有一些只是认识的人或者虽然认识很多年但是也只能是这样的! 第二类,关心你,可以交流感清,明显更加亲密一点. 不要对第一类朋友说第二 ...

  2. InceptionV4

    目录 1. inception v4 2. Inception-resnet-v1 & Inception-resnet-v2 2.1 Inception-resnet-v1的组成模块 2.2 ...

  3. vue & 百度地图:使用百度地图

    index.html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> &l ...

  4. 3.TCP协议

    一.TCP协议特点和报文段格式 面向连接的传输层协议 每一条TCP连接只能有两个端点 TCP提供可靠交付的服务,无差错,不丢失,不重复,按序到达 全双工通信 -> 发送缓冲:准备发送的数据&am ...

  5. SpringBoot多数据库连接(mysql+oracle)

    出于业务需求,有时我们需要在spring boot web应用程序中配置多个数据源并连接到多个数据库. 使用过Spring Boot框架的小伙伴们,想必都发现了Spring Boot对JPA提供了非常 ...

  6. Go语言基础语法总结

    1. 认识HelloWorld 在前面的<Go的安装和使用>这篇文章中已经写过HelloWorld.go了,现在就来逐行认识一下它. package main import "f ...

  7. hcharts生成图表

    借助hcharts插件,可以很方便地在模板页面中生成图表.类似插件还有echarts. 补充...

  8. ImportError: /lib64/libm.so.6: version `CXXAB_1.3.8.' not found (required by /usr/local/python37/lib/python3.7/site-packages/tensorflow/python/_pywrap_tensorflow_internal.so)

    问题背景 使用在AI项目中,由于需要用到tensorflow,scipy,sklearn等这些库,所以需要libstdc++库. 问题原因 这个问题的出现与写的代码无关,只与操作系统的libstdc+ ...

  9. Fortify Audit Workbench 笔记 Unreleased Resource: Database( 未释放资源:数据库)

    Unreleased Resource: Database 未释放资源:数据库 Abstract 程序可能无法成功释放某一项系统资源. Explanation 程序可能无法成功释放某一项系统资源. 资 ...

  10. 使用Esxi虚拟化部署OpenWrt/HomeLede+扩容硬盘 保姆级教程

    本文介绍使用VMware虚拟化平台部署OpenWrt/HomeLede,并扩容固件硬盘的方法. 推荐使用虚拟化方式部署软路由,理由如下: 部署.升级.回退.扩容等操作非常方便,特别适合折腾 可以方便的 ...