设计模式-单例模式(创建型模式)

本文介绍了Java中的两种单例模式实现:饿汉式和懒汉式。饿汉式在类加载时即创建单例,可能导致资源浪费;懒汉式则在首次调用时才创建,采用双重检查锁定(DCL)确保线程安全。然而,懒汉式在面对反射攻击时单例模式可能被破坏。
摘要由CSDN通过智能技术生成

单例模式


饿汉式
package com.design.single;

/**
 * @author MYM_ZUOYAN
 * @version 2.0
 * @date 2021/6/19 9:56
 * 单列模式-饿汉式
 *
 * 饿汉式特点:一上来就把所有的资源加载,会浪费空间
 */
public class Hungry {

    //可能会浪费空间
    private byte[] data1 = new byte[1024 * 1024];
    private byte[] data2 = new byte[1024 * 1024];
    private byte[] data3 = new byte[1024 * 1024];
    private byte[] data4 = new byte[1024 * 1024];

    private Hungry(){

    }

    private final static Hungry hungry = new Hungry();

    public static Hungry getInstance() {
        return hungry;
    }
}

懒汉式
package com.design.single;

/**
 * @author MYM_ZUOYAN
 * @version 2.0
 * @date 2021/6/19 10:32
 * 单例模式-懒汉模式
 */
public class Lazy {

    private Lazy(){
        System.out.println(Thread.currentThread().getName() + "ok");
    }

    private volatile static Lazy lazy;

    //双重检测模式的 懒汉式单例 简称 DCL懒汉式
    public static Lazy getInstance() {
        if (lazy == null) {
            synchronized (Lazy.class) {
                if (lazy == null) {
                    //不是一个原子性操作
                    lazy = new Lazy();
                    /**
                     * 1、分配内存空间
                     * 2、执行构造方法、初始化对象
                     * 3、把这个对象指向这个空间
                     */
                }
            }
        }
        return lazy;
    }

    //多线程并发
    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            new Thread(()->{
                Lazy.getInstance();
            }).start();
        }
    }
}

单例不安全,因为反射会破坏单例模式
所以用枚举

将class文件反编译成java文件
jad -sjava fileName.class

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mym_zuoyan_Tmac

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值