1.饿汉式
package singletonDemo; public class hungerSingleton { private hungerSingleton(){} private static hungerSingleton instance = new hungerSingleton(); public static hungerSingleton getInstance(){ return instance; } }
2.懒汉式
package singletonDemo; public class lazySingleton { private lazySingleton(){} private static lazySingleton instance; public synchronized static lazySingleton getInstance(){ if(instance == null){ instance = new lazySingleton(); } return instance; } }
3.双重检验锁式
package singletonDemo; public class doubleCheckSingleton { private doubleCheckSingleton(){} //使用volatile是为了防止编译指令重排序 //创建对象的过程为:1.在堆中分配内存空间 2.初始化该对象 3.将引用变量指向创建的内存空间 //字节码执行时有可能的导致创建对象的顺序变为 1->3->2 //则第二个线程读到instance==null时可能已经将引用指向了内存空间,但是还未初始化,产生使用时的风险 private volatile static doubleCheckSingleton instance; public static doubleCheckSingleton getInstance(){ if(instance ==null){ synchronized (doubleCheckSingleton.class){ if(instance == null){ instance = new doubleCheckSingleton(); } } } return instance; } }
4.内部静态类式
package singletonDemo; public class innerClassSingleton { private innerClassSingleton(){} private static class InnerClass{ private static innerClassSingleton instance = new innerClassSingleton(); } public static innerClassSingleton getInstance(){ return InnerClass.instance; } }
5.枚举式
package singletonDemo; public class enumSingleton { private enumSingleton(){} private static enum singleton{ INSTANCE; private enumSingleton instance ; private singleton(){ instance = new enumSingleton(); } public enumSingleton getInstance(){ return instance; } } public static enumSingleton getInstance(){ return singleton.INSTANCE.getInstance(); } }
6.注册器式
package singletonDemo; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; public class IocSingleton { private IocSingleton(){} private static Map<String,Object> ioc = new ConcurrentHashMap<String,Object>(); public static void registerIoc(String key,Object instance){ if(!ioc.containsKey(key)){ ioc.put(key,instance); } } public static Object getInstance(String key){ return ioc.get(key); } }
测试类与结果:
package singletonDemo; import java.util.concurrent.TimeUnit; public class singletonDemo { public static void main(String[] args) throws InterruptedException { //hungerSingleton System.out.println("-------饿汉式单例---------"); for(int i = 0;i<10;i++){ new Thread(()->{ hungerSingleton singleton = hungerSingleton.getInstance(); System.out.println(singleton); }).start(); } TimeUnit.SECONDS.sleep(2); //lazySingleton System.out.println("-------懒汉式单例---------"); for(int i = 0;i<10;i++){ new Thread(()->{ lazySingleton singleton = lazySingleton.getInstance(); System.out.println(singleton); }).start(); } TimeUnit.SECONDS.sleep(2); //doubleCheckSingleton System.out.println("-------双重校验锁(DCL)单例---------"); for(int i = 0;i<10;i++){ new Thread(()->{ doubleCheckSingleton singleton = doubleCheckSingleton.getInstance(); System.out.println(singleton); }).start(); } TimeUnit.SECONDS.sleep(2); //innerClassSingleton System.out.println("-------内部静态类单例---------"); for(int i = 0;i<10;i++){ new Thread(()->{ innerClassSingleton singleton = innerClassSingleton.getInstance(); System.out.println(singleton); }).start(); } TimeUnit.SECONDS.sleep(2); //enumSingleton System.out.println("-------枚举单例---------"); for(int i = 0;i<10;i++){ new Thread(()->{ enumSingleton singleton = enumSingleton.getInstance(); System.out.println(singleton); }).start(); } TimeUnit.SECONDS.sleep(2); //iocSingleton System.out.println("-------注册器单例---------"); for(int i = 0;i<10;i++){ new Thread(()->{ if(IocSingleton.getInstance("obj")==null){ Object obj = new Object(); IocSingleton.registerIoc("obj",obj); } System.out.println(IocSingleton.getInstance("obj")); }).start(); } TimeUnit.SECONDS.sleep(2); } }
输出结果:
-------饿汉式单例---------
singletonDemo.hungerSingleton@1e58fdc
singletonDemo.hungerSingleton@1e58fdc
singletonDemo.hungerSingleton@1e58fdc
singletonDemo.hungerSingleton@1e58fdc
singletonDemo.hungerSingleton@1e58fdc
singletonDemo.hungerSingleton@1e58fdc
singletonDemo.hungerSingleton@1e58fdc
singletonDemo.hungerSingleton@1e58fdc
singletonDemo.hungerSingleton@1e58fdc
singletonDemo.hungerSingleton@1e58fdc
-------懒汉式单例---------
singletonDemo.lazySingleton@5f7be8
singletonDemo.lazySingleton@5f7be8
singletonDemo.lazySingleton@5f7be8
singletonDemo.lazySingleton@5f7be8
singletonDemo.lazySingleton@5f7be8
singletonDemo.lazySingleton@5f7be8
singletonDemo.lazySingleton@5f7be8
singletonDemo.lazySingleton@5f7be8
singletonDemo.lazySingleton@5f7be8
singletonDemo.lazySingleton@5f7be8
-------双重校验锁(DCL)单例---------
singletonDemo.doubleCheckSingleton@3e1443
singletonDemo.doubleCheckSingleton@3e1443
singletonDemo.doubleCheckSingleton@3e1443
singletonDemo.doubleCheckSingleton@3e1443
singletonDemo.doubleCheckSingleton@3e1443
singletonDemo.doubleCheckSingleton@3e1443
singletonDemo.doubleCheckSingleton@3e1443
singletonDemo.doubleCheckSingleton@3e1443
singletonDemo.doubleCheckSingleton@3e1443
singletonDemo.doubleCheckSingleton@3e1443
-------内部静态类单例---------
singletonDemo.innerClassSingleton@1bfe578
singletonDemo.innerClassSingleton@1bfe578
singletonDemo.innerClassSingleton@1bfe578
singletonDemo.innerClassSingleton@1bfe578
singletonDemo.innerClassSingleton@1bfe578
singletonDemo.innerClassSingleton@1bfe578
singletonDemo.innerClassSingleton@1bfe578
singletonDemo.innerClassSingleton@1bfe578
singletonDemo.innerClassSingleton@1bfe578
singletonDemo.innerClassSingleton@1bfe578
-------枚举单例---------
singletonDemo.enumSingleton@57bf22
singletonDemo.enumSingleton@57bf22
singletonDemo.enumSingleton@57bf22
singletonDemo.enumSingleton@57bf22
singletonDemo.enumSingleton@57bf22
singletonDemo.enumSingleton@57bf22
singletonDemo.enumSingleton@57bf22
singletonDemo.enumSingleton@57bf22
singletonDemo.enumSingleton@57bf22
singletonDemo.enumSingleton@57bf22
-------注册器单例---------
java.lang.Object@c4982
java.lang.Object@c4982
java.lang.Object@c4982
java.lang.Object@c4982
java.lang.Object@c4982
java.lang.Object@c4982
java.lang.Object@c4982
java.lang.Object@c4982
java.lang.Object@c4982
java.lang.Object@c4982
Process finished with exit code 0