public class Singleton{
private static class SingletonHolder{
private static Singleton singleton = new Singleton();
}
private Singleton(){}
public static Singleton getInstance(){
return SingletonHolder.singleton;
}
}
反射机制破解单例模式
public class Singleton {
private static Singleton singleton= new Singleton();
private singleton() {
}
public static Singleton newInstance() {
return singleton;
}
}
public class BreakSingleton{
public static void main(String[] args){
Class aClass = Class.forName("Singleton");
Constructor c = aClass.getDeclaredConstructor(null);
c.setAccessible(true);
Singleton singleton1 = c.newInstance();
Singleton singleton2 = c.newInstance();
}
}
预防反射
public class Singleton {
private static Singleton singleton= new Singleton();
private singleton() {
//防止通过反射创建对象
if (singleton!=null){
throw new RuntimeException();
}
}
public static Singleton newInstance() {
return singleton;
}
}
反序列化机制破解单例模式
public class BreakSingleton{
public static void main(String[] args){
Singleton singleton1 = Singleton.getInstance();
Singleton singleton2 = Singleton.getInstance();
FileOutputStream fos = new FileOutputStream("路径");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oss.writeObject(singleton1);
oss.close();
fos.close();
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("路径"));
Singleton singleton3 = (Singleton)ois.readObject();
System.out.println("singleton1==singleton3:"+singleton1==singleton3);
}
}
预防措施:
public class Singleton implements Serializable{
private static Singleton singleton= new Singleton();
private singleton() {
}
public static Singleton newInstance() {
return singleton;
}
//反序列化定义该方法,则不需要创建新对象
private Object readResovle() throws ObjectStreamException{
return singleton;
}
}
public enum SingletonEnum {
/**
* 单例的推荐用法
*/
INSTANCE;
private Person person;
SingletonEnum() {
System.out.println("构造方法被调用");
person = new Person();
}
public Person getInstance(){
return person;
}
class Person{}
}