前言
提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。
提示:以下是本篇文章正文内容,下面案例可供参考
一、懒汉单例模式是什么?
声明一个静态对象,用户第一次调用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();
执行结果
总结
使用懒汉单例模式确实可以实现单例,不过通过序列化可以破坏单例。