单例模式笔记(1)----->懒汉单例模式及其反单例化


前言

提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


提示:以下是本篇文章正文内容,下面案例可供参考

一、懒汉单例模式是什么?

声明一个静态对象,用户第一次调用getInstance时才初始化,区别于恶汉模式中类加载就对静态对象进行初始化。

二、使用步骤

1.定义Singleton类

代码如下:

public class Singleton {
    private static Singleton instance;

    private Singleton() {
    }

    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

2.测试单例

代码如下:

System.out.println(Singleton.getInstance()==Singleton.getInstance());

结果打印为true。
在这里插入图片描述

3.序列化来打破单例

写两个静态方法写入对象流和读出对象流

    public static void writeObject() throws IOException {
        Singleton singleton = Singleton.getInstance();
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("C:\\Users\\lbj233\\Desktop\\single1.txt"));
        oos.writeObject(singleton);
        oos.flush();
        oos.close();
    }

    public static void readObject() {
        try {
            ObjectInputStream ois = new ObjectInputStream(new FileInputStream("C:\\Users\\lbj233\\Desktop\\single1.txt"));
            Singleton singleton = (Singleton) ois.readObject();
            System.out.println(singleton.toString());
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

当我们在Main函数中执行writeObject(),会如下错误:
在这里插入图片描述
需要让单例类去实现序列化

public class Singleton implements Serializable

之后执行writeObject()方法,没有报错,桌面上会出现一个TXT文件
在这里插入图片描述
最后执行两次readObject(),发现地址不同,单例被破坏。

        readObject();
        readObject();

执行结果
在这里插入图片描述

总结

使用懒汉单例模式确实可以实现单例,不过通过序列化可以破坏单例。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值