《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:
复制代码
单件模式:
    确保一个类只有一个实例,并提供一个全局的访问点
相关推荐
橘色的狸花猫4 分钟前
浪漫色彩下的博客系统
java·vue
墨雪不会编程8 分钟前
C++【string篇2】:从零基础开始到熟悉使用string类
java·开发语言·c++
夏幻灵22 分钟前
写给初次用IDEA的新人
java·ide·intellij-idea
jgyzl35 分钟前
2026.1.2 Tomcat保姆级使用教程
java·tomcat
知无不研1 小时前
.练习- Java字符串之String类创建字符串之使用equals和==判断字符串是否相等
java·开发语言
IT英语写作研习社1 小时前
一句话解释Java 8 流streams 和函数式接口、λ表达式的关系
java
Slow菜鸟1 小时前
Java基础 | JWT登录场景化最优方案(一)
java·开发语言
IT枫斗者1 小时前
Spring Boot 4.0 正式发布:新一代起点到底“新”在哪?(Spring Framework 7 / Java 25 / JSpecify / API 版本管理 / HTTP Service
java·开发语言·spring boot·后端·python·spring·http
龙茶清欢1 小时前
WebClient:Spring WebFlux 响应式 HTTP 客户端权威说明文档
java·spring·http
没有bug.的程序员2 小时前
网关在高并发场景下的优化实践:从Reactor模型到GC调优的深度指南
java·jvm·高并发·gc调优·网关优化·reactor模型·netty调优