美文网首页
设计模式笔记3--单例模式

设计模式笔记3--单例模式

作者: 执壹 | 来源:发表于2019-07-17 15:07 被阅读0次
image.png image.png image.png image.png image.png image.png image.png image.png

单例模式

懒汉式

image.png

懒汉式改进1---synchronized

image.png

加synchronized 在 11行代码上,注意synchronized加在static上锁的是LazySingleton这个类的class文件,而如果加的这个方法不是静态的,那么锁的是在堆内存中生成的对象

即加在static上的synchronized等价于如下:


image.png

因为加入了synchronized这种大范围的锁,所以在性能上有一定的消耗

懒汉式改进2---双重校验锁

image.png image.png image.png

两种方式解决重排序: 1.加volatile关键字 2.不允许其他线程看到当前线程的重排序

单例模式---静态内部类

image.png
public class StaticInnerClassSingleton{
  private static class InnerClass {
    private static StaticInnerClassSingleton staticInnerClassSingleton = new StaticInnerClassSingleton();
  
 }
public static StaticInnerClassSingleton getInstance() {
    return InnerClass.staticInnerClassSingleton; 
  }
}
//必须私有构造器
private StaticInnerClassSingleton(){
}

原理,JVM在初始化一个类时,会对多个线程同步一个类的锁---即class对象的初始化锁,假设这时线程0获取到了这个锁,那么线程1是无法看到线程0在初始化这个类对象的内部操作(重排序)

饿汉式

在类加载的时候就完成了初始化,避免线程同步问题,缺点,没有延迟加载效果

public class HungrySingleton() {
 private final static HungrySingleton hungrySingleton = new HungrySingleton();
   private HungrySingleton(){}
public static HungrySingleton getInstance() {
   return hungrySingleton;
  }
}

单例的破坏和解决

如果单例模式中存在序列化和反序列化 那么单例模式会被破坏
即 用单例模式序列化到文件里,再反序列化文件出来的对象 和原先的对象不是同一个对象

解决方案: 在单例模式加上下面方法(以上面的饿汉式为例):

private Object readResolve(){
    return hungrySingleton;
}

防止反射攻击,在构造器加上判断,以上面的饿汉式为例:


image.png

未完----

相关文章

  • 【Java】设计模式 —— 深入浅出单例模式

    学习笔记 参考:深入浅出单实例SINGLETON设计模式单例模式【Java】设计模式:深入理解单例模式 场景:一般...

  • 设计模式笔记3--单例模式

    单例模式 懒汉式 懒汉式改进1---synchronized 加synchronized 在 11行代码上,注意s...

  • 单例模式Java篇

    单例设计模式- 饿汉式 单例设计模式 - 懒汉式 单例设计模式 - 懒汉式 - 多线程并发 单例设计模式 - 懒汉...

  • python中OOP的单例

    目录 单例设计模式 __new__ 方法 Python 中的单例 01. 单例设计模式 设计模式设计模式 是 前人...

  • 单例

    目标 单例设计模式 __new__ 方法 Python 中的单例 01. 单例设计模式 设计模式设计模式 是 前人...

  • 设计模式 - 单例模式

    设计模式 - 单例模式 什么是单例模式 单例模式属于创建型模式,是设计模式中比较简单的模式。在单例模式中,单一的类...

  • 设计模式

    常用的设计模式有,单例设计模式、观察者设计模式、工厂设计模式、装饰设计模式、代理设计模式,模板设计模式等等。 单例...

  • 2018-04-08php实战设计模式

    一、单例模式 单例模式是最经典的设计模式之一,到底什么是单例?单例模式适用场景是什么?单例模式如何设计?php中单...

  • python 单例

    仅用学习参考 目标 单例设计模式 __new__ 方法 Python 中的单例 01. 单例设计模式 设计模式设计...

  • 基础设计模式:单例模式+工厂模式+注册树模式

    基础设计模式:单例模式+工厂模式+注册树模式 单例模式: 通过提供自身共享实例的访问,单例设计模式用于限制特定对象...

网友评论

      本文标题:设计模式笔记3--单例模式

      本文链接:https://www.haomeiwen.com/subject/birqlctx.html