Fullstar

Archives

  • December 2025
  • August 2024
  • July 2024
  • February 2024
  • November 2023
  • August 2023
  • July 2023
  • January 2023
  • November 2022
  • October 2022
  • September 2022
  • February 2022
  • January 2022
  • September 2021
  • January 2021
  • December 2020
  • November 2020
  • October 2020
  • September 2020
  • August 2020
  • July 2020

Categories

  • Code
  • Lens
  • Life
0
Fullstar
  • Code

设计模式-单例模式

  • September 10, 2020
  • Brandon

Looking for a Shorter Overview?

AI Summary

单例模式确保一个类只创建并管理一个对象,文中同时说明了多例模式的基本思路。代码依次给出饥饿式、注册式、延迟式,以及通过双重检查锁和静态内部类实现线程安全延迟加载的方法。

Key Moments

AI-generated
1

单例与多例的对象数量

单例模式由类自身创建并管理唯一对象,而多例模式由类自身维护多个可供获取的对象。
2

饥饿式单例的静态初始化

通过静态常量在类加载时立即创建实例,并经由静态方法返回该实例。
3

延迟式单例的线程安全实现

双重检查锁需配合volatile防止并发与指令重排问题,静态内部类则利用类初始化机制同时实现延迟加载和线程安全。
4

注册式与多例的实例获取

注册式模式以映射表按名称缓存或反射创建实例,多例模式则将预建实例放入列表并按索引返回。
Total
0
Shares
0
0
0

单例模式下的类仅有一个对象,且由自身进行创建与管理,与其类似的设计模式还有多例模式,多例模式由自身创建并管理多个对象

一.饥饿式单例模式

class Single{
    //饥饿式
    private static final Single instance = new Single();
    private Single(){}
    public static Single getInstance(){
        return instance;
    }
}

二.注册式单例模式

class SingleRegister{
    //注册式
    static private HashMap<String,Object> reg = new HashMap<>();
    //静态代码段仅在对象初始化时执行一次,且仅能初始化静态变量
    static {
        reg.put("SingleRegister",new SingleRegister());
    }
    private SingleRegister(){}
    public static SingleRegister getInstance(String name){
        try {
            if (reg.get(name) == null) {
                reg.put(name, Class.forName(name).newInstance());
            }
        }catch (Exception e){
            e.printStackTrace();
            return null;
        }
        return (SingleRegister) (reg.get(name));
    }
}

三.延迟式单例模式

class SingleLazy{
    //延迟式
    private SingleLazy(){}
    private static SingleLazy instance = null;
    public static SingleLazy getInstance(){
        if(instance == null)
            instance = new SingleLazy();
        return instance;
    }
}

四.多线程安全延迟式单例模式

1.双重检查锁

class SingleLazyThread{
    //多线程版延迟式
    private SingleLazyThread(){}
    private volatile static SingleLazyThread instance;
    //加了volatile则若一个线程对变量进行了更改则通知其余线程重新进入内存读取
    //数据,而不是读取cache内的值
    public static SingleLazyThread getInstance(){
        //双重检查锁
        if(instance == null){
            synchronized (SingleLazyThread.class){
                if(instance == null){
                    instance = new SingleLazyThread();
                }
            }
        }
        return instance;
    }
}

2.静态内部类

class SingleLazyThreadByStatic{
    //静态内部类实现lazy单例模式的线程安全
    private static class InstanceHolder{
        public static final SingleLazyThreadByStatic instance = new SingleLazyThreadByStatic();
    }
    //实现原理:
    //外部类在加载时不会加载内部类,因此实现了lazy
    //且虚拟机会保证一个类的<clinit>()方法在多线程环境中被正确地加锁、同步,从而保证了线程安全
    public static SingleLazyThreadByStatic getInstance(){
        return InstanceHolder.instance;
    }
    private SingleLazyThreadByStatic(){}
}

五.多例模式

class Multi{
    //多例模式
    static private Multi multi = new Multi();
    static private Multi multi1 = new Multi();
    private Multi(){}
    static private List<Multi> list = new ArrayList<>();
    static{
        list.add(multi);
        list.add(multi1);
    }
    public static Multi getInstance(int index){
        //指定拿哪一个instance
        return list.get(index);
    }
}

Related Posts

AI-generated

设计模式-工厂模式

产品该由谁创建,不必让客户端决定。通过抽象工厂、具体工厂和动物接口的配合,可按需生成猫、狗、鱼等对象,并用静态方法实现简单工厂。
56.9% match September 9, 2020

Java 多线程

从 Thread、Runnable 到 Lambda 创建线程,再理解 join 等待、yield 让出 CPU,以及线程池核心线程、阻塞队列和最大线程数的完整调度规则。
49.9% match September 26, 2020

Questions Answered

AI-generated

饥饿式单例如何创建唯一实例?

类加载时通过静态常量直接创建并返回唯一对象。

注册式单例如何按名称获取对象?

注册表缓存实例,缺失时反射创建并加入注册表。

延迟式单例为何需要线程安全处理?

多个线程可能同时判断为空,导致创建多个实例。

静态内部类为何能实现安全的延迟单例?

内部类按需加载,类初始化机制保证同步与唯一性。

Next Up

解耦产品创建
掌握线程调度
构建健壮代码
容器性能取舍
Total
0
Shares
Share 0
Tweet 0
Pin it 0
Brandon

Previous Article
  • Code

设计模式-工厂模式

  • September 9, 2020
  • Brandon
View Post
Next Article
  • Code

vi编译器查询手册

  • September 23, 2020
  • Brandon
View Post
You May Also Like
View Post
  • Code

Letta部署记录

  • Brandon
  • December 26, 2025
View Post
  • Code

WordPress 后台任务利器:使用 BGRunner 构建可靠的异步处理

  • Brandon
  • December 14, 2025
View Post
  • Code

WordPress image offload

  • Brandon
  • December 14, 2025
View Post
  • Code

ComfyUI应用手册

  • Brandon
  • December 6, 2025
View Post
  • Code

Leetcode Java常用代码

  • Brandon
  • February 17, 2024
View Post
  • Code

Golang入门

  • Brandon
  • February 4, 2024
View Post
  • Code

Setting Up and Maintaining a Ubuntu Environment for My Home Server

  • Brandon
  • November 24, 2023
View Post
  • Code

Swift Learning Log

  • Brandon
  • August 31, 2023

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

Fullstar

Input your search keywords and press Enter.

设计模式-工厂模式

Java 多线程

异常处理的合理使用与防御式编程

Java 容器

SpringBoot+WebSocket

Leetcode Java常用代码

UP NEXT

设计模式-工厂模式

56.9% match September 9, 2020 0