顾名思义就是单个实例。html
当你开出来的摸具,并使用摸具产生惟一一个模型,这就是单例。java
而单例模式就是为了保证该类只产生一个实例。并发
简单说,你不须要多个实例的时候,就能够使用单例。工具
工具类通常都定义为单例,由于工具类不须要那么多个实例。线程
单例的好处:code
public class Singleton{ private static final Singleton instance = new Singleton(); private Singleton() {} public static Singleton getInstance() { return instance; } }
public class Singleton { private static Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } } } return instance; } }
public class Singleton { private Singleton() {} public static Singleton getInstance() { return SingletonHolder.instance; } static class SingletonHolder { private static final Singleton instance = new Singleton3(); } }
public enum Singleton { instance; }
注:枚举本质上就是饿汉模式,具体参考做业16:java枚举类的秘密 。htm
public class Main { public static void main(String[] args) throws Exception{ Class<? extends Singleton> aClass = Singleton.getClass(); Constructor<? extends Singleton> constructor = aClass.getDeclaredConstructor(); constructor.setAccessible(true); // 暴力反射 Singleton singleton = constructor.newInstance(); System.out.println(singleton == Singleton.getInstance()); // false } } // 以饿汉为例的解决方案:构造器中抛出异常,防止对象建立成功 public class Singleton{ private static final Singleton instance = new Singleton(); private Singleton() { if (instance != null) throw new RuntimeException("private constructor"); } public static Singleton getInstance() { return instance; } }
public class Main { public static void main(String[] args) throws IOException, ClassNotFoundException { // 序列化 ObjectOutputStream oo = new ObjectOutputStream(new FileOutputStream(new File("singleton.txt"))); oo.writeObject(Singleton.getInstance()); oo.close(); // 反序列化 ObjectInputStream oi = new ObjectInputStream(new FileInputStream(new File("singleton.txt"))); Singleton singleton = (Singleton) oi.readObject(); oi.close(); System.out.println(singleton == Singleton.getInstance()); // false } } // 以饿汉为例的解决方案:添加readResolve方法 public class Singleton implements Serializable { private static final Singleton instance = new Singleton(); private Singleton() {} public static Singleton getInstance() { return instance; } private Object readResolve() { return instance; } }
参考资料:对象