zoukankan      html  css  js  c++  java
  • 测试高并发环境下五种单例模式的执行效率

    一、高并发环境下五种单例模式的调用效率测试示例

    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如果要产生的单例对象占用资源比较大,需要延时加载,则:静态内部类好于懒汉式。

    如有任何疑问可联系邮箱: 给我发邮件、或直接联系QQ:1584875179 || 点返回首页

  • 相关阅读:
    步入大公司一年及三十而立的一些思考
    let和const
    简明学习webpack
    npm&&yarn和package.json
    基于jQuery.i18n.properties插件实现前端页面国际化
    Sequence Model
    系统性整理项目:第一篇(续篇)-osm存入PostgreSQL+PostGIS并构建路网表结构
    系统性整理项目:第一篇(环境+数据)
    window下源码编译mmcv-full==1.2.1
    多边形平滑算法-ChaikinSmoothing
  • 原文地址:https://www.cnblogs.com/aeon/p/10212206.html
Copyright © 2011-2022 走看看