无法加载可扩展计数器

到处都需要计数器,例如,查找应用程序的关键KPI,应用程序的负载,服务的请求总数,用于查找应用程序吞吐量的一些KPI等。

由于所有这些需求,并发复杂性也增加了,这使这个问题变得有趣。

如何实现并发计数器

  • 同步 –这是JDK 1.5之前的唯一选项,因为现在我们正在等待JDK8发布,因此绝对不是一个选项。
  • 基于锁 –切勿尝试将其用作计数器,否则它将性能很差
  • 等待免费 -Java不支持Fetch-and-add ,因此实现起来有点困难。
  • 无锁 –在“ 比较和交换”的良好支持下,此选项看起来不错。

基于比较和交换的计数器如何执行

我使用AtomicInteger进行此测试,并且每个线程使此计数器递增1百万次,以增加线程的争用数量,并逐渐增加。

试验机详细信息

作业系统:Windows 8

JDK:1.7.0.25

处理器:Intel i7-3632QM,8 Core

内存:8 GB

Y轴 –增加一百万次所需的时间

X轴–螺纹数

随着线程数量的增加,增加计数器所花费的时间也增加了,这是由于争用造成的。 对于基于CAS的计数器,是CAS故障导致减速。

这是我们可以获得的最佳性能吗? 肯定不是它们是实现并发计数器的更好的解决方案,让我们来看看它们。

备用并发计数器

让我们看一些实现计数器的解决方案,以更好的方式处理竞争:

  • 基于核心的计数器 –维护每个逻辑核心的计数器,这样您将减少争用。 您拥有这种类型的计数器的唯一问题是,如果线程数大于逻辑核心数,那么您将开始注意到竞争。
  • 基于线程的计数器 –维护计数器以了解将要使用系统的线程总数。 当线程数大于逻辑核心数时,此方法效果很好。

让我们测试一下

不同类型的计数器花费的时间

Y轴 –增加一百万次所需的时间

X轴–螺纹数

同时用计数器进行比基于原子计数器要好得多,16个线程是5倍左右的时间比较好,这是巨大的差异!

CAS失效率

Y轴 – CAS失效100Ks

X轴–螺纹数

由于存在争用,基于原子的计数器会出现很多故障,并且随着我添加更多线程和其他计数器的运行而呈指数级增长。

观察

多核计算机变得易于使用,并且我们必须改变处理并发的方式,而当拥有24或48核服务器的情况很普遍时,传统的并发方式在当今时代将无法扩展。

  • 为了减少争用,您必须使用多个计数器,然后再将它们聚合
  • 如果线程数少于或等于内核数,则基于内核的计数器效果很好
  • 当线程数量远大于可用内核时,基于线程的计数器就很好
  • 减少争用的关键是确定要写入哪个线程的计数器。我使用了基于线程ID的简单方法,但是可以使用更好的方法,请查看JDK 8的ThreadLocalRandom以获得一些想法。
  • JDK8的LongAdder使用基于线程的方法,该方法创建许多插槽以减少争用。

该测试中使用的所有计数器的代码都可以在Github上获得

参考:来自JCG合作伙伴 Ashkrit Sharma的“ 多核可扩展计数器 ”,准备好博客了。

翻译自: https://www.javacodegeeks.com/2013/09/scalable-counters-for-multi-core.html

无法加载可扩展计数器

无法加载可扩展计数器_多核可扩展计数器相关推荐

  1. 加载cv2调用摄像头_用Python获取摄像头并实时控制人脸

    Python基础视频教程 入门免费观看-创客学院​www.makeru.com.cn 实现流程 从摄像头获取视频流,并转换为一帧一帧的图像,然后将图像信息传递给opencv这个工具库处理,返回灰度图像 ...

  2. vs 调试 无法加载自定义可视化工具_推荐 5 款好用的REST API工具

    作者 | Marta Krzyk 首发|架构头条 译者 | 王强 策划 | 小智 市面上可用的 REST API 工具选项有很多,我们来看看其中一些开发人员最喜欢的工具. 1 API 定义 Swagg ...

  3. java加载并运行虚拟机_《深入理解Java虚拟机》- Java虚拟机是如何加载Java类的?...

    Java虚拟机是如何加载Java类的?  这个问题也就是面试常问到的Java类加载机制.在年初面试百战之后,菜鸟喜鹊也是能把这流程倒背如流啊!但是,也只是字面上的背诵,根本就是像上学时背书考试一样. ...

  4. 上拉加载更多后台数据_微信小程序端操作云数据库

    一.分清几个概念 1.云开发,简言之就是可以直接用微信小程序开发者工具完成一个从前台到后台的小程序项目. 2.小程序端,使用云开发的时候,miniprogram中写的代码可以叫做小程序端(真实是我不知 ...

  5. wordcloud里面设置mask加载不出来词频_一条龙搞定情感分析:文本预处理、加载词向量、搭建RNN

    IMDB Sentiment Classification from scratch Author: Beyond Time: 2019.04.26 情感分析是上手NLP的最简单的任务之一,它就是一个 ...

  6. DataX Transformer从入口到加载的源码分析及UDF扩展与使用

    DataX GitHub DataX Transformer 目录 1 前言 2 需求说明 3 解决方案分析 4 解密算法 5 Hive UDF 5.1 测试数据 5.2 新建 Maven 项目 5. ...

  7. arcengine 加载地图不显示_地图建筑建模制作与输出

    导读 阅读完此文,你会了解: 1.地图建筑模型通常如何制作的 2.地图建筑模型替换策略 地图上往往会有一些定制建筑的需求,例如将下面的水立方做成气泡感的. 加入定制模型之前 加入定制模型之后 这种需求 ...

  8. 加载多瓦片地图_手把手教 | 网络时空大数据爬取与分析DAS系统(瓦片地图获取)...

    地理计算语言,为大众赋能地理智慧. --DAS Team 爬取分析DAS系统下载 地址:https://pan.baidu.com/s/1NkoyFhzMtm13ivlOOzukow 提取码:6ky8 ...

  9. 加载vue文件步骤_无法在重新加载时读取vue文件

    我正在使用vue-pdf和vue-server-renderer . 在内部浏览页面时,它工作正常,但在重新加载时,webpack无法在vue-pdf模块中读取.vue文件 . vue-pdf/src ...

最新文章

  1. scrapy使用cookie的三种方式
  2. 在SAP除了使用Cordova生产移动应用外,还有这种方式
  3. python虚拟环境配置文件_uwsgi 配置 python virtualenv 虚拟环境目录 ( ini 配置)
  4. 腾讯加持,雷军力荐,这款游戏手机要火?
  5. Python 爬取 B 站数据分析,宋智孝李光洙谁最受中国粉丝喜爱
  6. exit()和_exit()的区别
  7. Kubernetes系列之理解K8s Service的几种模式
  8. Postfix+Dovecot+LAMP+Extmail搭建web邮件系统(二)
  9. MySQL之字符串拼接
  10. C语言排序的几种算法
  11. 任天堂switch底座带网口全新方案分享
  12. CPU的亲缘性affinity
  13. display 常用属性
  14. 小学计算机课第二课堂活动,小学信息技术第二课堂计划.doc
  15. 2.07 CISC与RISC
  16. JAVA毕业设计公交线路查询系统计算机源码+lw文档+系统+调试部署+数据库
  17. macOS hashcat 安装
  18. 图片的角如何弄成圆角?
  19. 马尔科夫链原理介绍【通俗易懂】
  20. c语言的jmp_buf函数

热门文章

  1. 2019.01.27【NOIP普及组】模拟赛C组总结
  2. linux下redis的安装和配置
  3. JFreeChart(五)之XY图
  4. JavaFX UI控件教程(五)之Radio Button
  5. 这些保护Spring Boot 应用的方法,你都用了吗?
  6. Java多线程神器:join使用及原理
  7. Promise解决异步操作问题
  8. Struts文件上传与下载详解_上传单个文件
  9. css实现一级下拉菜单
  10. 计算机网络产生的历史背景,网络技术背景及sdn概述.pdf