设计模式-单例

概述

在类加载后,整个系统只有一个实例类

饿汉式

java 复制代码
public class Mg1 {
    private static final Mg1 INSTANCE = new Mg1();
    private Mg1(){

    }
    public static Mg1 getInstance(){
        return INSTANCE;
    }
    public static void main(String[] args) {
        System.out.println(Mg1.getInstance() == Mg1.getInstance());
        // true
    }
}

懒汉式

java 复制代码
/**
 *	会存在内部不安全问题
 */
public class Main {
    public static void main(String[] args) {

        for (int i = 0; i < 100; i++) {
            new Thread(()->{
                System.out.println(Mg2.getInstance().hashCode());
            }).start();
        }
    }
}
class Mg2 {
    private static Mg2 INSTANCE;
    private Mg2(){

    }
    public static synchronized Mg2 getInstance(){
        if(INSTANCE == null){
            try{
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            INSTANCE = new Mg2();
        }
        return  INSTANCE;
    }
}

静态内部类

java 复制代码
/**
 * 静态内部类
 * 懒加载
 */
public class Mg3 {
    private Mg3(){}
    private static class Mg3Holder{
        private final static Mg3 INSTANCE = new Mg3();
    }
    public static Mg3 getInstance(){
        return Mg3Holder.INSTANCE;
    }

    public static void main(String[] args) {
        new Thread(()->{
            for (int i = 0; i < 100; i++) {
                System.out.println(Mg3.getInstance().hashCode());
            }
        }).start();
    }
}

枚举单例

java 复制代码
/**
 * 枚举单例
 * 不仅可以解决线程同步,还可以反序列化
 */
public enum Mg4 {
    INSTANCE;

    public static void main(String[] args) {
        for (int i = 0; i < 100; i++) {
            new Thread(()->{
                System.out.println(Mg4.INSTANCE.hashCode());

            }).start();
        }
    }
}
相关推荐
小bo波1 小时前
从"任意文件复制"深挖Java I/O:字符流与字节流的本质抉择
java·nio·io流·后端开发·文件复制
用户6919026813394 小时前
Vibe Coding 开发项目的基本范式
人工智能·设计模式·代码规范
nanxun8861 天前
记一次诡异的 Docker 容器"串包"故障排查
java
怕浪猫1 天前
领域特定语言(Domain-Specific Language, DSL)
设计模式·程序员·架构
用户1563068103511 天前
Day01 | Java 基础(Java SE)
java
行者全栈架构师1 天前
Maven dependency:tree 的 8 个高级用法
java·后端
行者全栈架构师1 天前
IDEA 中 Maven 项目的 15 个红色报错快速解决方法
java·后端
令人头秃的代码0_01 天前
mac(m5)平台编译openjdk
java
唐青枫2 天前
Java JDBC 实战指南:从 Connection 到事务和连接池
java