单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例 |
饿汉模式:加载快,线程安全,开销大。
publicclass Singleton {
privatestatic Singleton instance = new Singleton();
private Singleton() {}
publicstatic Singleton getInstance() {
returninstance; }
} |
反射、序列化破解单例
@SuppressWarnings("all") publicstaticvoid main(String[] args) throws Exception { Singleton instance1 = Singleton.getInstance(); // Singleton instance2 = Singleton.getInstance(); System.out.println(instance1); // System.out.println(instance2); // //反射破解单例 // Class<Singleton> cla = (Class<Singleton>) Class.forName("com.jbit.resource.Singleton"); // Constructor<Singleton> con = cla.getDeclaredConstructor(null); // con.setAccessible(true); // Singleton instance3 = con.newInstance(null); // System.out.println(instance3);
//序列化破解单例 FileOutputStream file = new FileOutputStream("d:/a.txt"); ObjectOutputStream obj = new ObjectOutputStream(file); obj.writeObject(instance1); obj.flush(); obj.close(); ObjectInputStream oos = new ObjectInputStream(new FileInputStream("d:/a.txt")); Singleton instance5 = (Singleton) oos.readObject(); System.out.println(instance5);
}
|
防破解单例
publicclass Singleton implements Serializable {
privatestatic Singleton instance = new Singleton();
private Singleton() { // 防止反射破解单例 if (instance != null) { thrownew RuntimeException(); } } publicstatic Singleton getInstance() {
returninstance; } // 防止序列化,回调方法 private Object readResolve() throws ObjectStreamException {
returninstance; } } |
懒汉模式:开销小、懒加载、效率最慢、线程安全。
publicclass Singleton {
privatestatic Singleton instance;
private Singleton() {}
publicstaticsynchronized Singleton getInstance() { if(instance==null){ instance = new Singleton(); } returninstance; } } |
静态内部类单例:效率高、有延迟加载、线程安全。
publicclass Singleton {
privatestaticclass SingletonInstonce {
privatestaticfinal Singleton instance = new Singleton(); }
private Singleton() { }
privatestatic Singleton getInstonce() { return SingletonInstonce.instance; } } |
枚举单例:加载快、天然可以防止序列与反射、无延迟加载
publicenum Singleton { INSTANCE; privatevoid SingletonOperation() { //添加自己需要的操作 } } |
双重检查锁模式:容易出问题,不建议使用。
publicclass Singleton {
publicstatic Singleton instance = null;
publicstatic Singleton getInstance(){ if(instance==null){ Singleton sc; synchronized (Singleton.class) { sc = instance; if(sc==null){ synchronized (Singleton.class) { sc = new Singleton(); } } instance = sc; } } return instance; } public Singleton(){} } |
应用:
加载资源文件 线程池设计 任务管理器 Spring中的每一个Bean 日志记录 …… |