设计模式-单例

概述

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

饿汉式

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();
        }
    }
}
相关推荐
念何架构之路1 小时前
Go reflect 包:结构体反射 —Field、Tag 与 VisibleFields
java·数据库·golang
liangbo71 小时前
03-JDK 10/11 局部变量推断与 LTS:var 到底该怎么用
java
Percep_gan2 小时前
调用天翼云的对象存储ZOS,很详细
java·1024程序员节
若亦_2 小时前
数据结构>>优先级队列(堆)
java·数据结构
Wang's Blog2 小时前
Java 项目实战: 交友项目 - 查询圈子个人动态:查询我的动态需求分析
java·开发语言·交友
denlaku2 小时前
JDK 23 新特性详解
java
code2cat3 小时前
Java高级篇之Hibernate:让对象映射到表,理解持久化与事务
java·后端·hibernate·1024程序员节
.Hypocritical.3 小时前
JUC + 三大设计模式(单例、工厂、代理)
设计模式·juc·1024程序员节
骑着蜗牛撵大象3273 小时前
飞牛fnOS部署Damselfly:Compose编排、照片目录与7100固定访问
java·docker·rpc·dubbo·fnos·照片管理·damselfly
金銀銅鐵4 小时前
[Java] 用 CLI 展示 EnumSet 增减元素时的内部变化(下)
java·后端·ai编程