设计模式-单例

概述

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

饿汉式

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();
        }
    }
}
相关推荐
sg_knight7 小时前
设计模式实战:命令模式(Command)
python·设计模式·命令模式
一 乐7 小时前
电影院|基于springboot + vue电影院购票管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·电影院购票管理管理系统
恼书:-(空寄7 小时前
JVM GC 日志分析 + 常见 GC 场景 + 实战参数调优
java·jvm
消失的旧时光-19437 小时前
Spring Boot 实战(五):接口工程化升级(统一返回 + 异常处理 + 错误码体系 + 异常流转机制)
java·spring boot·后端·解耦
杨凯凡9 小时前
【012】图与最短路径:了解即可
java·数据结构
比特森林探险记9 小时前
【无标题】
java·前端
椰猫子9 小时前
Javaweb(Filter、Listener、AJAX、JSON)
java·开发语言
朝新_10 小时前
【Spring AI 】核心知识体系梳理:从入门到实战
java·人工智能·spring
一 乐10 小时前
旅游|基于springboot + vue旅游信息推荐系统(源码+数据库+文档)
java·vue.js·spring boot·论文·旅游·毕设·旅游信息推荐系统
我命由我1234510 小时前
Android 开发中,关于 Gradle 的 distributionUrl 的一些问题
android·java·java-ee·android studio·android jetpack·android-studio·android runtime