设计模式-单例

概述

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

饿汉式

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();
        }
    }
}
相关推荐
左左右右左右摇晃2 小时前
Java并发——synchronized锁
java·开发语言
sxlishaobin2 小时前
Java I/O 模型详解:BIO、NIO、AIO
java·开发语言·nio
彭于晏Yan2 小时前
Spring AI(二):入门使用
java·spring boot·spring·ai
有一个好名字3 小时前
vibe codeing 开发流程
java
兑生3 小时前
【灵神题单·贪心】3745. 三元素表达式的最大值 | 排序贪心 | Java
java·开发语言
polaris06303 小时前
Windows操作系统部署Tomcat详细讲解
java·windows·tomcat
卓怡学长3 小时前
m280本科生导师指导平台
java·数据库·spring·tomcat·maven·intellij-idea
一直都在5723 小时前
Java死锁
java·开发语言
敲代码的约德尔人4 小时前
JavaScript 设计模式完全指南
javascript·设计模式
我真会写代码4 小时前
深度解析并发编程锁升级:从偏向锁到重量级锁,底层原理+面试考点全拆解
java·并发编程·