从框架源码学设计模式之单例模式(2)

简介: 从框架源码学设计模式之单例模式(2)

学习设计模式不要死板, 有时候各个设计模式之间没有明显的界限

今天说说我在看框架源码过程中遇到的关于单例模式的设计。

系列问题


1.单例模式


确保全局只有一个实例。减少该类实例的频繁创建,节省资源。

使用场景:

  1. 要求生产唯一序列号。
  2. WEB 中的计数器,不用每次刷新都在数据库里加一次,用单例先缓存起来。
  3. 创建的一个对象需要消耗的资源过多,比如 I/O 与数据库的连接等。

常见使用方式:

  1. 懒汉式,线程不安全版本。 不催不创建实例。
public class Singleton {
    private static Singleton singleton;
    private Singleton() {}
    public static Singleton getInstance() {
        if (singleton == null) {
            singleton = new Singleton();
        }
        return singleton;
    }
}
  1. 懒汉式,线程安全版本。实例创建方法加锁(粗粒度锁)
  2. 懒汉式,双重校验锁版本(安全)。实例创建方法双重校验(锁细化)
  3. 懒汉式,静态内部类(安全)。调用创建方法时,触发类的加载,利用类只会被加载一次这个特性,保证单例。


public class Singleton {
    private Singleton() {}
    private static class SingletonInstance {
        private static final Singleton INSTANCE = new Singleton();
    }
    public static Singleton getInstance() {
        return SingletonInstance.INSTANCE;
    }
}
  1. 饿汉式,静态常量/静态代码块(不如翻译为勤快式),利用类加载时的初始化。static:类变量,总能拿到一个初始化值。final:禁止指令重排;保证必然初始化。
public class Singleton {
    private final static Singleton INSTANCE = new Singleton();
    private Singleton(){}
    public static Singleton getInstance(){
        return INSTANCE;
    }
    /*
    private static Singleton instance;
    static {
        instance = new Singleton();
    }
    */
}
  1. 枚举:线程安全。 但是可读性很差。


2.spring 中单例模式


Spring 下默认的 bean 均为 singleton,bean 统一交给容器管理,获取对象从容器里取。

但也有一些不在容器的管理范围的组件。spring 使用了单例模式.


2.1 OrderComparator 比较器

spring 中很多组件都是有顺序的,你也许对@Order 注解很有印象,定义组件的顺序。 OrderComparator 就是那个比较器

来看看源码

public class OrderComparator implements Comparator<Object> {
public static final OrderComparator INSTANCE = new OrderComparator();
...
}


还有他的子类AnnotationAwareOrderComparator

public class AnnotationAwareOrderComparator extends OrderComparator {
 public static final AnnotationAwareOrderComparator INSTANCE = new AnnotationAwareOrderComparator();
}


都是典型的饿汉式。

本文使用 mdnice 排版


相关文章
|
2天前
|
设计模式 缓存 安全
Java设计模式的单例模式应用场景
Java设计模式的单例模式应用场景
17 4
|
22天前
|
设计模式 SQL 安全
【设计模式】第二篇:单例模式的几种实现And反射对其的破坏
一个普通实例化,一个反射实例化 但是我们如果通过反射的方式进行实例化类,会有什么问题呢? public static void main(String[] args) throws Exception { Lazy1 lazy1 = getLazy1();
21 5
|
2月前
|
设计模式 安全 Java
【JAVA】Java 中什么叫单例设计模式?请用 Java 写出线程安全的单例模式
【JAVA】Java 中什么叫单例设计模式?请用 Java 写出线程安全的单例模式
|
7天前
|
设计模式 安全 Java
Java中的单例模式是一种设计模式,它保证一个类只有一个实例,并提供一个全局访问点
Java单例模式确保类仅有一个实例,并提供全局访问点。常见实现包括: - 饿汉式:静态初始化,线程安全。 - 懒汉式:延迟初始化,需同步保证线程安全。 - 双重检查锁定:优化懒汉式,减少同步开销。 - 静态内部类:延迟加载,线程安全。 - 枚举:简洁线程安全,不适用于复杂构造。 - 容器实现:如Spring框架,用于依赖注入。选择依据需求,如延迟加载、线程安全和扩展性。
36 10
|
7天前
|
设计模式 缓存 安全
Java设计模式的单例模式应用场景
Java设计模式的单例模式应用场景
18 8
|
4天前
|
设计模式 SQL 安全
Java设计模式:单例模式之六种实现方式详解(二)
Java设计模式:单例模式之六种实现方式详解(二)
|
4天前
|
设计模式 JavaScript 前端开发
[JavaScript设计模式]惰性单例模式
[JavaScript设计模式]惰性单例模式
|
7天前
|
设计模式 缓存 安全
java中的设计模式&单例模式
java中的设计模式&单例模式
|
10天前
|
设计模式 安全 Java
Java设计模式之单例模式详解
Java设计模式之单例模式详解
|
3天前
|
设计模式 缓存 安全
【Java设计模式 - 创建型模式1】单例模式
【Java设计模式 - 创建型模式1】单例模式
4 0