扎金花网站怎么做,wordpress数据表文档,上海好的高端网站建设服务公司,国家企业信息网官网文章目录 一、对比总览详细解释 二、代码1. 饿汉式2. 饱汉式3. 饱汉式-双检锁4. 静态内部类5. 枚举单例 三、性能对比 一、对比总览
以下是不同单例模式实现方式的特性对比表格。表格从线程安全性、延迟加载、实现复杂度、反序列化安全性、防反射攻击性等多个方面进行考量。
… 文章目录 一、对比总览详细解释 二、代码1. 饿汉式2. 饱汉式3. 饱汉式-双检锁4. 静态内部类5. 枚举单例 三、性能对比 一、对比总览
以下是不同单例模式实现方式的特性对比表格。表格从线程安全性、延迟加载、实现复杂度、反序列化安全性、防反射攻击性等多个方面进行考量。
特性饿汉式饱汉式饱汉式-双检锁静态内部类枚举单例推荐线程安全性√×√√√延迟加载×√√√×实现复杂度√√×√√反序列化安全性××××√防反射攻击性××××√
详细解释 线程安全性 饿汉式类加载时即创建实例因为instance是static线程安全。饱汉式未使用同步机制线程不安全。饱汉式-双检锁使用同步块和双重检查锁线程安全。静态内部类通过类加载机制线程安全。枚举单例JVM确保线程安全。 延迟加载 饿汉式类加载时即创建实例不具备延迟加载。饱汉式实例在首次使用时创建具备延迟加载。饱汉式-双检锁实例在首次使用时创建具备延迟加载。静态内部类实例在首次使用时创建因为静态内部类只有在使用时才会加载具备延迟加载。枚举单例类加载时即创建实例不具备延迟加载。 实现复杂度 饿汉式实现简单。饱汉式实现简单。饱汉式-双检锁实现相对复杂。静态内部类实现简单。枚举单例实现简单。 反序列化安全性 饿汉式、饱汉式、饱汉式-双检锁、静态内部类需要实现 readResolve 方法以防止反序列化创建新实例。枚举单例天然防止反序列化创建新实例JVM保证。 防反射攻击性 饿汉式、饱汉式、饱汉式-双检锁、静态内部类可能通过反射创建新实例。枚举单例防止反射攻击创建新实例时抛出 IllegalArgumentException。
二、代码
1. 饿汉式
public class OrderManager1 {GetterSetterprivate MapString, TradeOrder orders new HashMap();Getterprivate static final OrderManager1 instance new OrderManager1();/*** 添加订单** param order 顺序*/public void addOrder(TradeOrder order) {orders.put(order.getId(), order);}/*** 获取订单** param orderId 订单id* return {link TradeOrder}*/public TradeOrder getOrder(String orderId) {return orders.get(orderId);}
}2. 饱汉式
public class OrderManager2 {GetterSetterprivate MapString, TradeOrder orders new HashMap();private static OrderManager2 instance;public static OrderManager2 getInstance(){if (instance null){instance new OrderManager2();}return instance;}/*** 添加订单** param order 顺序*/public void addOrder(TradeOrder order) {orders.put(order.getId(), order);}/*** 获取订单** param orderId 订单id* return {link TradeOrder}*/public TradeOrder getOrder(String orderId) {return orders.get(orderId);}
}3. 饱汉式-双检锁
public class OrderManager3 {GetterSetterprivate MapString, TradeOrder orders new HashMap();private static OrderManager3 instance;public static OrderManager3 getInstance(){if (instance null){synchronized (OrderManager3.class){if (instance null){instance new OrderManager3();}}instance new OrderManager3();}return instance;}/*** 添加订单** param order 顺序*/public void addOrder(TradeOrder order) {orders.put(order.getId(), order);}/*** 获取订单** param orderId 订单id* return {link TradeOrder}*/public TradeOrder getOrder(String orderId) {return orders.get(orderId);}
}4. 静态内部类
public class OrderManager4 {GetterSetterprivate MapString, TradeOrder orders new HashMap();private static class SingletonHelper{private static final OrderManager4 INSTANCE new OrderManager4();}public static OrderManager4 getInstance(){return SingletonHelper.INSTANCE;}/*** 添加订单** param order 顺序*/public void addOrder(TradeOrder order) {orders.put(order.getId(), order);}/*** 获取订单** param orderId 订单id* return {link TradeOrder}*/public TradeOrder getOrder(String orderId) {return orders.get(orderId);}
}5. 枚举单例
public enum OrderManager5 {INSTANCE;GetterSetterprivate MapString, TradeOrder orders new HashMap();/*** 添加订单** param order 顺序*/public void addOrder(TradeOrder order) {orders.put(order.getId(), order);}/*** 获取订单** param orderId 订单id* return {link TradeOrder}*/public TradeOrder getOrder(String orderId) {return orders.get(orderId);}
}三、性能对比
package org.dragon.singleton;import lombok.extern.slf4j.Slf4j;import java.util.*;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.function.Supplier;Slf4j
public class SingletonPerformanceTest {static long timeout 20; // 超时时间单位为秒static int testIterations 10_000_000; // 测试次数static int threadCount 1000; // 并发线程数static MapString, HashMapString, Long result new HashMap();public static void main(String[] args) {/** 多次调用结果是最后一次调用存入。为什么多次调用因为单次test不准确总是靠前的OrderManager跑的快可能是因为Java某些机制导致的* 所以多次调用逐渐平稳。* */firstCreationTest();mulAccessTest();mulAccessTest();mulAccessTest();ConcurrentAccessTest();ConcurrentAccessTest();printRes();ConcurrentAccessTest();printRes();ConcurrentAccessTest();printRes();}/*** 打印结果*/private static void printRes(){ArrayListString names new ArrayList();names.add(OrderManager1.class.getSimpleName());names.add(OrderManager2.class.getSimpleName());names.add(OrderManager3.class.getSimpleName());names.add(OrderManager4.class.getSimpleName());names.add(OrderManager5.class.getSimpleName());// 表头System.out.printf(%-20s%-20s%-25s%-25s%-20s%n, Singleton Type, First Creation (ms), Multiple Access (ms), Concurrent Access (ms), Memory Used (MB));System.out.println(---------------------------------------------------------------------------------------------------------------);for (String name : names) {// 打印结果转换时间为毫秒System.out.printf(%-20s%-20.3f%-25.3f%-25.3f%-20.3f%n, name, result.get(name).get(firstCreation) / 1_000_000.0, result.get(name).get(mulAccess) / 1_000_000.0, result.get(name).get(ConcurrentAccess) / 1_000_000.0, 0 / (1024.0 * 1024.0));}}/*** 首次创建测试*/private static void firstCreationTest(){ListRunnable tests new ArrayList();tests.add(()-firstCreation(OrderManager1::getInstance));tests.add(()-firstCreation(OrderManager2::getInstance));tests.add(()-firstCreation(OrderManager3::getInstance));tests.add(()-firstCreation(OrderManager4::getInstance));tests.add(()-firstCreation(() - OrderManager5.INSTANCE));// 随机化测试顺序Collections.shuffle(tests);//runfor (Runnable test : tests) {test.run();log.info(Complete one test);try {Thread.sleep(200);} catch (InterruptedException e) {throw new RuntimeException(e);}}}/*** 多次访问测试*/private static void mulAccessTest(){ListRunnable tests new ArrayList();tests.add(()-mulAccess(OrderManager1::getInstance, testIterations));tests.add(()-mulAccess(OrderManager2::getInstance, testIterations));tests.add(()-mulAccess(OrderManager3::getInstance, testIterations));tests.add(()-mulAccess(OrderManager4::getInstance, testIterations));tests.add(()-mulAccess(() - OrderManager5.INSTANCE, testIterations));// 随机化测试顺序Collections.shuffle(tests);//runfor (Runnable test : tests) {test.run();log.info(Complete one test);try {Thread.sleep(200);} catch (InterruptedException e) {throw new RuntimeException(e);}}}/*** 多线程访问测试*/private static void ConcurrentAccessTest(){ListRunnable tests new ArrayList();tests.add(()-ConcurrentAccess(OrderManager1::getInstance, testIterations, threadCount));tests.add(()-ConcurrentAccess(OrderManager2::getInstance, testIterations, threadCount));tests.add(()-ConcurrentAccess(OrderManager3::getInstance, testIterations, threadCount));tests.add(()-ConcurrentAccess(OrderManager4::getInstance, testIterations, threadCount));tests.add(()-ConcurrentAccess(() - OrderManager5.INSTANCE, testIterations, threadCount));// 随机化测试顺序Collections.shuffle(tests);//runfor (Runnable test : tests) {test.run();log.info(Complete one test);try {Thread.sleep(200);} catch (InterruptedException e) {throw new RuntimeException(e);}}}/*** 首次创建** param singletonSupplier 单一供应商* return long ns*/private static T long firstCreation(SupplierT singletonSupplier){// 测试首次创建时间long startTime System.nanoTime();T instance singletonSupplier.get();long endTime System.nanoTime();long resTime endTime - startTime;//save resString simpleName instance.getClass().getSimpleName();HashMapString, Long resMap result.computeIfAbsent(simpleName, k-new HashMap());resMap.put(firstCreation, resTime);return resTime;}/*** 多次访问** param singletonSupplier 单一供应商* param iterations 迭代* return long ns*/private static T long mulAccess(SupplierT singletonSupplier, int iterations){//预热for (int i 0; i 100_000; i) {T instance singletonSupplier.get();}//计算long startTime System.nanoTime();for (int i 0; i iterations; i) {T instance singletonSupplier.get();}long endTime System.nanoTime();long resTime endTime - startTime;//save resString simpleName singletonSupplier.get().getClass().getSimpleName();HashMapString, Long resMap result.computeIfAbsent(simpleName, k-new HashMap());resMap.put(mulAccess, resTime);return resTime;}/*** 并发访问** param singletonSupplier 单一供应商* param iterations 迭代* param threadCount 线程数* return long ns*/private static T long ConcurrentAccess(SupplierT singletonSupplier, int iterations, int threadCount){ExecutorService executorService Executors.newFixedThreadPool(100);//预热CountDownLatch latch1 new CountDownLatch(100);for (int i 0; i threadCount; i) {executorService.submit(() - {for (int j 0; j 100_000; j) {T instance singletonSupplier.get();}latch1.countDown();});}try {boolean completed latch1.await(timeout, TimeUnit.SECONDS);if (!completed) {System.out.println(Concurrent access test for 预热 singletonSupplier.get().getClass().getSimpleName() timed out!);}} catch (InterruptedException e) {e.printStackTrace();}//计算CountDownLatch latch2 new CountDownLatch(threadCount);long startTime System.nanoTime();for (int i 0; i threadCount; i) {executorService.submit(() - {for (int j 0; j iterations; j) {T instance singletonSupplier.get();}latch2.countDown();});}try {boolean completed latch2.await(timeout, TimeUnit.SECONDS);if (!completed) {System.out.println(Concurrent access test for singletonSupplier.getClass().getSimpleName() timed out!);}} catch (InterruptedException e) {e.printStackTrace();}long endTime System.nanoTime();long concurrentAccessTime endTime - startTime;executorService.shutdown();//save resString simpleName singletonSupplier.get().getClass().getSimpleName();HashMapString, Long resMap result.computeIfAbsent(simpleName, k-new HashMap());resMap.put(ConcurrentAccess, concurrentAccessTime);return concurrentAccessTime;}
}结果输出如下
[17:15:54.519] [INFO ] org.dragon.singleton.SingletonPerformanceTest 73 firstCreationTest - Complete one test
[17:15:54.730] [INFO ] org.dragon.singleton.SingletonPerformanceTest 73 firstCreationTest - Complete one test
[17:15:54.936] [INFO ] org.dragon.singleton.SingletonPerformanceTest 73 firstCreationTest - Complete one test
[17:15:55.141] [INFO ] org.dragon.singleton.SingletonPerformanceTest 73 firstCreationTest - Complete one test
[17:15:55.347] [INFO ] org.dragon.singleton.SingletonPerformanceTest 73 firstCreationTest - Complete one test
[17:15:55.554] [INFO ] org.dragon.singleton.SingletonPerformanceTest 97 mulAccessTest - Complete one test
[17:15:55.782] [INFO ] org.dragon.singleton.SingletonPerformanceTest 97 mulAccessTest - Complete one test
[17:15:56.007] [INFO ] org.dragon.singleton.SingletonPerformanceTest 97 mulAccessTest - Complete one test
[17:15:56.227] [INFO ] org.dragon.singleton.SingletonPerformanceTest 97 mulAccessTest - Complete one test
[17:15:56.445] [INFO ] org.dragon.singleton.SingletonPerformanceTest 97 mulAccessTest - Complete one test
[17:15:56.669] [INFO ] org.dragon.singleton.SingletonPerformanceTest 97 mulAccessTest - Complete one test
[17:15:56.906] [INFO ] org.dragon.singleton.SingletonPerformanceTest 97 mulAccessTest - Complete one test
[17:15:57.146] [INFO ] org.dragon.singleton.SingletonPerformanceTest 97 mulAccessTest - Complete one test
[17:15:57.376] [INFO ] org.dragon.singleton.SingletonPerformanceTest 97 mulAccessTest - Complete one test
[17:15:57.598] [INFO ] org.dragon.singleton.SingletonPerformanceTest 97 mulAccessTest - Complete one test
[17:15:57.818] [INFO ] org.dragon.singleton.SingletonPerformanceTest 97 mulAccessTest - Complete one test
[17:15:58.054] [INFO ] org.dragon.singleton.SingletonPerformanceTest 97 mulAccessTest - Complete one test
[17:15:58.276] [INFO ] org.dragon.singleton.SingletonPerformanceTest 97 mulAccessTest - Complete one test
[17:15:58.495] [INFO ] org.dragon.singleton.SingletonPerformanceTest 97 mulAccessTest - Complete one test
[17:15:58.716] [INFO ] org.dragon.singleton.SingletonPerformanceTest 97 mulAccessTest - Complete one test
[17:15:59.430] [INFO ] org.dragon.singleton.SingletonPerformanceTest 121 ConcurrentAccessTest - Complete one test
[17:15:59.658] [INFO ] org.dragon.singleton.SingletonPerformanceTest 121 ConcurrentAccessTest - Complete one test
[17:16:02.737] [INFO ] org.dragon.singleton.SingletonPerformanceTest 121 ConcurrentAccessTest - Complete one test
[17:16:08.533] [INFO ] org.dragon.singleton.SingletonPerformanceTest 121 ConcurrentAccessTest - Complete one test
[17:16:13.700] [INFO ] org.dragon.singleton.SingletonPerformanceTest 121 ConcurrentAccessTest - Complete one test
[17:16:19.432] [INFO ] org.dragon.singleton.SingletonPerformanceTest 121 ConcurrentAccessTest - Complete one test
[17:16:24.632] [INFO ] org.dragon.singleton.SingletonPerformanceTest 121 ConcurrentAccessTest - Complete one test
[17:16:30.366] [INFO ] org.dragon.singleton.SingletonPerformanceTest 121 ConcurrentAccessTest - Complete one test
[17:16:35.516] [INFO ] org.dragon.singleton.SingletonPerformanceTest 121 ConcurrentAccessTest - Complete one test
[17:16:40.431] [INFO ] org.dragon.singleton.SingletonPerformanceTest 121 ConcurrentAccessTest - Complete one test
Singleton Type First Creation (ms) Multiple Access (ms) Concurrent Access (ms) Memory Used (MB)
---------------------------------------------------------------------------------------------------------------
OrderManager1 0.010 16.848 4928.236 0.000
OrderManager2 0.010 18.592 5504.781 0.000
OrderManager3 0.009 19.127 5513.309 0.000
OrderManager4 0.241 18.772 4920.940 0.000
OrderManager5 0.117 16.637 4704.835 0.000
[17:16:45.002] [INFO ] org.dragon.singleton.SingletonPerformanceTest 121 ConcurrentAccessTest - Complete one test
[17:16:48.982] [INFO ] org.dragon.singleton.SingletonPerformanceTest 121 ConcurrentAccessTest - Complete one test
[17:16:52.778] [INFO ] org.dragon.singleton.SingletonPerformanceTest 121 ConcurrentAccessTest - Complete one test
[17:16:57.834] [INFO ] org.dragon.singleton.SingletonPerformanceTest 121 ConcurrentAccessTest - Complete one test
[17:17:02.298] [INFO ] org.dragon.singleton.SingletonPerformanceTest 121 ConcurrentAccessTest - Complete one test
Singleton Type First Creation (ms) Multiple Access (ms) Concurrent Access (ms) Memory Used (MB)
---------------------------------------------------------------------------------------------------------------
OrderManager1 0.010 16.848 4217.333 0.000
OrderManager2 0.010 18.592 4340.869 0.000
OrderManager3 0.009 19.127 4824.581 0.000
OrderManager4 0.241 18.772 3743.032 0.000
OrderManager5 0.117 16.637 3558.995 0.000
[17:17:06.778] [INFO ] org.dragon.singleton.SingletonPerformanceTest 121 ConcurrentAccessTest - Complete one test
[17:17:11.231] [INFO ] org.dragon.singleton.SingletonPerformanceTest 121 ConcurrentAccessTest - Complete one test
[17:17:15.733] [INFO ] org.dragon.singleton.SingletonPerformanceTest 121 ConcurrentAccessTest - Complete one test
[17:17:20.812] [INFO ] org.dragon.singleton.SingletonPerformanceTest 121 ConcurrentAccessTest - Complete one test
[17:17:25.837] [INFO ] org.dragon.singleton.SingletonPerformanceTest 121 ConcurrentAccessTest - Complete one test
Singleton Type First Creation (ms) Multiple Access (ms) Concurrent Access (ms) Memory Used (MB)
---------------------------------------------------------------------------------------------------------------
OrderManager1 0.010 16.848 4281.649 0.000
OrderManager2 0.010 18.592 4849.279 0.000
OrderManager3 0.009 19.127 4782.224 0.000
OrderManager4 0.241 18.772 4267.228 0.000
OrderManager5 0.117 16.637 4233.907 0.000 进程已结束退出代码为 0可以去多跑几次基本上最后一种枚举单例性能属于最好的一批。并且也最安全。