《HeadFirst设计模式(第二版)》第五章代码——单例模式

代码文件目录:
初始版本:
java 复制代码
package Chapter5_SingletonPattern.origin;

/**
 * @Author 竹心
 * @Date 2023/8/5
 **/

public class Singleton {
    private static Singleton uniqueInstance;

    private Singleton(){}

    public static Singleton getInstance(){
        if(uniqueInstance == null){
            uniqueInstance = new Singleton();
        }
        return uniqueInstance;
    }

    //问题:多线程中会出现多个实例被创建的情况

    //other functions

}
三种解决多线程问题的方法:
java 复制代码
package Chapter5_SingletonPattern.Multithread;

import Chapter5_SingletonPattern.origin.Singleton;

/**
 * @Author 竹心
 * @Date 2023/8/5
 **/

public class Singleton1 {
    private static Singleton1 uniqueInstance;

    private Singleton1(){}

    //使用synchronized迫使每个线程进入此方法之前必须轮到他
    //但是这样会导致性能开销大

    public static synchronized Singleton1 getInstance(){
        if(uniqueInstance == null){
            uniqueInstance = new Singleton1();
        }
        return uniqueInstance;
    }

    //other functions
}
java 复制代码
package Chapter5_SingletonPattern.Multithread;

/**
 * @Author 竹心
 * @Date 2023/8/5
 **/

public class Singleton2 {
    //急切创建实例:在静态初始化器中就创建实例
    private static Singleton2 uniqueInstance = new Singleton2();

    private Singleton2(){}

    public static Singleton2 getInstance(){
        return uniqueInstance;
    }

    //other functions
}
java 复制代码
package Chapter5_SingletonPattern.Multithread;

import Chapter5_SingletonPattern.origin.Singleton;

/**
 * @Author 竹心
 * @Date 2023/8/5
 **/

public class Singleton3 {

    //用双重检查加锁减少使用同步,降低开销

    private volatile static Singleton3 uniqueInstance;
    //volatile保证uniqueInstance为单实例类的时候多个线程正确处理

    private Singleton3(){}

    public static Singleton3 getInstance(){
        if(uniqueInstance == null){
            synchronized (Singleton3.class){
                if(uniqueInstance == null){//进入同步区块后,再检查一次
                    uniqueInstance = new Singleton3();
                }
            }
        }
        return uniqueInstance;
    }
}
Notes:
复制代码
单件模式:
    确保一个类只有一个实例,并提供一个全局的访问点
相关推荐
我滴老baby1 分钟前
企业级工具链设计从单一工具到分层工具体系的架构实践
java·开发语言·架构
Hello.Reader3 分钟前
算法基础(三)—— 插入排序从整理扑克牌到有序数组
java·算法·排序算法
罗超驿5 分钟前
3.快乐数专题学习笔记——双指针法在LeetCode 202题中的应用
java·算法·leetcode·职场和发展
liann1198 分钟前
Agent 内存马禁止 Attach JVM
java·jvm·安全·网络安全·系统安全·网络攻击模型·信息与通信
小雅痞13 分钟前
[Java][Leetcode middle] 36. 有效的数独
java·算法·leetcode
代码漫谈13 分钟前
JVM 参数调优:Spring Boot与JDK新特性的最佳结合
java·jvm·spring boot
卷毛的技术笔记17 分钟前
双十一零点扛过10倍流量洪峰:Sentinel与Redis+Lua的分布式限流深度避坑指南
java·redis·分布式·后端·系统架构·sentinel·lua
逻辑驱动的ken17 分钟前
Java高频面试考点场景题27
java·开发语言·面试·职场和发展·求职招聘
一氧化二氢.h34 分钟前
【java】的数组列表和集合的区别是什么
java·开发语言
PersistJiao34 分钟前
开发环境对比:VS Code、Cursor、IntelliJ IDEA
java·ide·intellij-idea