设计模式-单例

概述

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

饿汉式

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();
        }
    }
}
相关推荐
泰山小张只吃荷园7 分钟前
期末Python复习-输入输出
java·前端·spring boot·python·spring cloud·docker·容器
Mr_Xuhhh10 分钟前
程序地址空间
android·java·开发语言·数据库
YSRM16 分钟前
异或-java-leetcode
java·算法·leetcode
大明湖的狗凯.19 分钟前
MySQL 中的乐观锁与悲观锁
java·数据库·mysql
z2023050824 分钟前
linux之调度管理(13)- wake affine 唤醒特性
java·开发语言
AI人H哥会Java25 分钟前
【JAVA】Java高级:Java网络编程——TCP/IP与UDP协议基础
java·开发语言
robin_suli1 小时前
Java多线程八股(三)一>多线程环境使用哈希表和ArrayList
java·开发语言·多线程·哈希表
NiNg_1_2341 小时前
Java中的多线程
java·开发语言
丁总学Java1 小时前
nohup java -jar supporterSys.jar --spring.profiles.active=prod &
java·spring·jar
呆呆小雅1 小时前
C# 结构体
android·java·c#