package com.nasuf.pattern.singleton;/** * 单例模式 */public class Test { public static void main(String[] args) { Singleton1 singleton1 = Singleton1.getInstance(); Singleton1 singleton2 = Singleton1.getInstance(); System.out.println(singleton1 == singleton2); // true System.out.println(singleton1.hashCode()); // 621009875 System.out.println(singleton2.hashCode()); // 621009875 }}/** * 饿汉式一 * 长处:简略,在类加载时实现实例化,防止了线程同步问题 * 毛病:在类加载时实现实例化,没有达到懒加载成果,如果从未应用过这个实例,则会造成内存节约 */class Singleton1 { private Singleton1() { } private final static Singleton1 instance = new Singleton1(); public static Singleton1 getInstance() { return instance; }}/** * 饿汉式二 * 长处:简略,在类加载时实现实例化,防止了线程同步问题 * 毛病:在类加载时实现实例化,没有达到懒加载成果,如果从未应用过这个实例,则会造成内存节约 */class Singleton2 { private Singleton2() { } private static Singleton2 instance; static { instance = new Singleton2(); } public static Singleton2 getInstance() { return instance; }}/** * 懒汉式一 * 长处:懒加载成果 * 毛病:线程不平安,只能利用在单线程状况下 */class Singleton3 { private Singleton3() { } private static Singleton3 instance; public static Singleton3 getInstance() { if (instance == null) { instance = new Singleton3(); } return instance; }}/** * 懒汉式二 * 长处:懒加载成果,线程平安 * 毛病:效率低,每个线程在想取得类的实例时,执行getInstance办法都要进行同步 */class Singleton4 { private Singleton4() { } private static Singleton4 instance; public static synchronized Singleton4 getInstance() { if (instance == null) { instance = new Singleton4(); } return instance; }}/** * 懒汉式三 * 毛病:线程不平安,效率低,每个线程在想取得类的实例时,执行getInstance办法都要进行同步 */class Singleton5 { private Singleton5() { } private static Singleton5 instance; public static Singleton5 getInstance() { if (instance == null) { synchronized (Singleton5.class) { instance = new Singleton5(); } } return instance; }}/** * 双重查看(举荐应用) */class Singleton6 { private Singleton6() { } private static volatile Singleton6 instance; public static Singleton6 getInstance() { if (instance == null) { synchronized (Singleton6.class) { if (instance == null) { instance = new Singleton6(); } } } return instance; }}/** * 动态外部类(举荐应用) * 外部类装载时,动态外部类不会被装载;外部类只会被装载一次,在类进行初始化时,其余线程无奈进入 * 保障了线程平安; */class Singleton7 { private Singleton7() { } private static class SingletonInstance { private static final Singleton7 INSTANCE = new Singleton7(); } public static synchronized Singleton7 getInstance() { return SingletonInstance.INSTANCE; }}/** * 枚举(举荐应用) * 线程平安,避免反序列化从新创立新的对象 * 应用:Singleton8 instance = Singleton.INSTANCE */enum Singleton8 { INSTANCE;}