《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:
复制代码
单件模式:
    确保一个类只有一个实例,并提供一个全局的访问点
相关推荐
腻害兔2 小时前
【若依项目-产品经理视角】深度拆解 RuoYi-Vue-Pro 商城模块:从商品管理到交易引擎,50 张表撑起一整套电商系统
java·大数据·vue.js·产品经理·ai编程
码智社3 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
萧瑟余晖4 小时前
JDK 26 新特性详解
java·开发语言
马优晨5 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
维天说7 小时前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态
java·服务器·json
Zane19948 小时前
并发 vs 并行:别再傻傻分不清了,一文讲透 Java 并发编程的第一课
java·后端
杨充9 小时前
11.DDD与战术建模
设计模式·开源·代码规范
杨充9 小时前
12.综合实战图片框架
设计模式·开源·代码规范
噢,我明白了9 小时前
java中Excel的导入和导出(EasyExcel)
java·开发语言·excel
吠品9 小时前
Zabbix Web界面误报Server未运行的排查与解决
java·服务器·数据库