一、高并发环境下五种单例模式的调用效率测试示例
package edu.aeon.test; import java.util.concurrent.CountDownLatch; import edu.aeon.model.singleton.HungrySingleton; import edu.aeon.model.singleton.LazySingleton; import edu.aeon.model.singleton.LazySingleton1; import edu.aeon.model.singleton.SingletonDCL; import edu.aeon.model.singleton.SingletonEnum; /** * 测试多线程环境下五种创建单例模式的调用效率 * * @author aeon * */ public class Test { public static void main(String[] args) throws Exception { long start = System.currentTimeMillis(); int threadNum = 100; final CountDownLatch countDownLatch = new CountDownLatch(threadNum); for (int i = 0; i < threadNum; i++) { new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 1000000; i++) { /*//1.测试饿汉式 HungrySingleton hungrySingleton = HungrySingleton.getSinletonInstance(); //2.测试懒汉式 LazySingleton lazySingleton = LazySingleton.getLazySingletonInstance(); //3.测试双重检测锁 SingletonDCL singletonDCL = SingletonDCL.getInstance(); //4.测试静态内部类 LazySingleton1 lazySingleton1 = LazySingleton1.getLazySingletonInstance(); //5.测试枚举 SingletonEnum singletonEnum = SingletonEnum.singletonEnumInstance;*/ } countDownLatch.countDown(); } }).start(); } countDownLatch.await(); // main线程阻塞,直到计数器变为0,才会继续往下执行! long end = System.currentTimeMillis(); System.out.println("总耗时:" + (end - start)); } }
二、测试结果
单例模式 | 调用时间(毫秒) |
饿汉式 | 15 |
懒汉式 | 897 |
双重检查锁 | 16 |
静态内部类 | 15 |
枚举式 | 14 |
三、高并发情况下单例模式的选用标准
3.1如果要产生的单例对象占用资源比较少,不需要延时加载,则:枚举式好于饿汉式。
3.2如果要产生的单例对象占用资源比较大,需要延时加载,则:静态内部类好于懒汉式。