《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:
复制代码
单件模式:
    确保一个类只有一个实例,并提供一个全局的访问点
相关推荐
亦暖筑序9 分钟前
Spring AI Alibaba 报错合集:我踩过的那些坑
java·后端
indexsunny36 分钟前
互联网大厂Java面试实战:核心技术与微服务架构在电商场景中的应用
java·spring boot·redis·kafka·maven·spring security·microservices
摇滚侠37 分钟前
Java 多线程基础 Java Multithreading Basics
java
今天你TLE了吗1 小时前
LLM到Agent&RAG——AI概念概述 第一章:大模型
java·人工智能·语言模型·大模型
你的牧游哥1 小时前
Java 核心概念详解
java·开发语言
深邃-1 小时前
【数据结构与算法】-顺序表链表经典算法
java·c语言·数据结构·c++·算法·链表·html5
JAVA学习通1 小时前
励志从零打造LeetCode平台之C端竞赛列表
java·vscode·leetcode·docker·状态模式
海兰1 小时前
【第3篇-续】多模型多模态项目实现示例(增加OpenAI通用适配)附源代码
java·人工智能·spring boot·alibaba·spring ai
澄澈青空~1 小时前
有一个叫R2C,也有一个叫G2C
java·数据库·人工智能·c#
SarL EMEN2 小时前
海康威视摄像头ISUP(原EHOME协议) 摄像头实时预览springboot 版本java实现,并可以在浏览器vue前端播放(附带源码)
java·前端·spring boot