1恶汉式单例模式
package com.example.demo.singleton;
public class SingletonDemo {
private static SingletonDemo instance = new SingletonDemo();
private SingletonDemo(){}
public static SingletonDemo getInstance(){
return instance;
}
public static void main(String[] args) {
SingletonDemo demo1 = SingletonDemo.getInstance();
SingletonDemo demo2 = SingletonDemo.getInstance();
System.out.println(demo1);
System.out.println(demo2);
}
}
2、恶汉式单例模式
package com.example.demo.singleton;
public class SingletonDemo1 {
private static SingletonDemo1 instance ;
private SingletonDemo1(){}
public static synchronized SingletonDemo1 getInstance(){
if(instance == null){
instance = new SingletonDemo1();
}
return instance;
}
public static void main(String[] args) {
SingletonDemo1 demo1 = SingletonDemo1.getInstance();
SingletonDemo1 demo2 = SingletonDemo1.getInstance();
System.out.println(demo1);
System.out.println(demo2);
}
}
3、静态内部类 单例模式
package com.example.demo.singleton;
public class SingletonDemo2 {
private static class SingleInstance{
private static final SingletonDemo2 instance = new SingletonDemo2();
}
private SingletonDemo2(){}
public static SingletonDemo2 getInstance(){
return SingleInstance.instance;
}
public static void main(String[] args) {
SingletonDemo2 demo1 = SingletonDemo2.getInstance();
SingletonDemo2 demo2 = SingletonDemo2.getInstance();
System.out.println(demo1);
System.out.println(demo2);
}
}
4、枚举 单例模式
package com.example.demo.singleton;
public enum SingletonDemo3 {
INSTANCE;
public void singletonOperation(){
}
}
5、如何防止序列化和反序列化漏洞 (用懒汉式 单例模式举例)
package com.example.demo.singleton;
import java.io.*;
public class SingletonDemo4 implements Serializable {
private static SingletonDemo4 instance ;
private SingletonDemo4(){
if(instance != null){
throw new RuntimeException();
}
}
public static synchronized SingletonDemo4 getInstance(){
if(instance == null){
instance = new SingletonDemo4();
}
return instance;
}
private Object readResolve(){
return instance;
}
public static void main(String[] args) throws Exception {
SingletonDemo4 demo1 = SingletonDemo4.getInstance();
SingletonDemo4 demo2 = SingletonDemo4.getInstance();
System.out.println(demo1);
System.out.println(demo2);
FileOutputStream fos = new FileOutputStream("F:/a.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(demo1);
oos.close();
fos.close();
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("F:/a.txt"));
SingletonDemo4 demo5 = (SingletonDemo4) ois.readObject();
System.out.println(demo1 == demo5);
}
}