延迟分析中的案例研究:锁定与同步

特别是在这篇文章中,我们将讨论:

  • java.concurrent.Lock创建的垃圾
  • 比较锁与同步
  • 如何以编程方式测量延迟
  • 争用对锁和同步的影响
  • 协调遗漏对延迟测试的影响

回到我最喜欢的主题之一,垃圾创建/分配。 有关此主题的更多详细信息,请参阅我以前的文章(例如,性能优化 的第一条规则和重新访问 性能优化 的第一条规则:逃逸分析的效果 )。 特别是为什么分配是理解性能问题的如此关键因素。

几天前,在尝试诊断JIT编译过程中分配的一些奇怪影响时,我遇到了一个问题,即java.util.concurrent.locks.ReentrantLock分配,但仅当处于竞争状态时才进行分配。 (这可以通过运行一个测试程序(如以下程序)轻松地证明,使用– verbosegc在Lock上创建竞争)。

下面的竞争锁的gc输出示例:

[GC (Allocation Failure)  16384K->1400K(62976K), 0.0016854 secs]
[GC (Allocation Failure)  17784K->1072K(62976K), 0.0011939 secs]
[GC (Allocation Failure)  17456K->1040K(62976K), 0.0008452 secs]
[GC (Allocation Failure)  17424K->1104K(62976K), 0.0008338 secs]
[GC (Allocation Failure)  17488K->1056K(61952K), 0.0008799 secs]
[GC (Allocation Failure)  17440K->1024K(61952K), 0.0010529 secs]
[GC (Allocation Failure)  17408K->1161K(61952K), 0.0012381 secs]
[GC (Allocation Failure)  17545K->1097K(61440K), 0.0004592 secs]
[GC (Allocation Failure)  16969K->1129K(61952K), 0.0004500 secs][GC (Allocation Failure)  17001K->1129K(61952K), 0.0003857 secs]

我想知道清理这些分配所必需的垃圾回收是否意味着在高度竞争的环境中,与使用内置的“ synchronized ”相比, Lock在同步方面是更糟糕的选择。

当然,这个问题比其他任何事情都更具学术性。 如果您确实非常在意延迟,那么您将永远(或者肯定永远不会)陷入需要大量线程锁定的情况。 不过,因为过程和结果很有趣,所以请和我在一起。

有点历史。 锁于2004年在Java 1.5版中引入。迫切需要将Lock与其他并发实用程序一起使用,以简化并发构造。 到那时为止,您已经处理了Object上的内置synchronizedwait()notify()

ReentrantLock除了提供synchronized功能外,还提供许多功能,
这仅仅是列举的一小部分:

  • 非结构化–即您不限于在块或方法中使用它。 它使您可以通过几种方法持有锁。
  • 锁定轮询
  • 超时等待锁
  • 可配置的公平政策

但是,它们在延迟测试方面的表现如何?

我在下面编写了一个简单的测试,比较了锁与同步的性能。

  • 该代码使您可以更改线程数(1个线程表示没有争用),从而调整争用量。
  • 在有或没有协同遗漏的情况下进行测量(请参阅以前的博客《协调遗漏的效果》 )
  • 运行测试锁定或同步测试。
  • 要记录我的结果,您会注意到我使用了Histogram类。 这是由彼得·劳瑞(Peter Lawrey)创建的。 你可以找到类为纪事核心在实用这里 。
import org.junit.Test;import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;public class LockVsSync {private static final boolean COORDINATED_OMISSION = Boolean.getBoolean("coordinatedOmission");//Either run testing Lock or testing synchronizedprivate static final boolean IS_LOCK = Boolean.getBoolean("isLock");private static final int NUM_THREADS = Integer.getInteger("numThreads");@Testpublic void test() throws InterruptedException {Lock lock = new ReentrantLock();for (int t = 0; t < NUM_THREADS; t++) {if (t == 0) {//Set the first thread as the master which will be measured//The other threads are only to cause contentionRunner r = new Runner(lock, true);r.start();} else {Runner r = new Runner(lock, false);r.start();}}synchronized(this){//Hold the main thread from completingwait();}}private void testLock(Lock rlock) {rlock.lock();try {for (int i = 0; i < 2; i++) {double x = 10 / 4.5 + i;}} finally {rlock.unlock();}}private synchronized void testSync() {for (int i = 0; i < 2; i++) {double x = 10 / 4.5 + i;}}class Runner extends Thread {private Lock lock;private boolean master;public Runner(Lock lock, boolean master) {this.lock = lock;this.master = master;}@Overridepublic void run() {Histogram histogram = null;if (master)histogram = new Histogram();long rate = 1000;//expect 1 every microsecondlong now =0;for (int i = -10000; i < 200_000_000; i++) {if(i==0){now = System.nanoTime();} else if(i>0){if(!COORDINATED_OMISSION) {now += rate;while(System.nanoTime() < now);}elsenow = System.nanoTime();}if(IS_LOCK)testLock(lock);elsetestSync();if(i>=0 && master){histogram.sample(System.nanoTime() - now);}}if (master) {System.out.println(histogram.toMicrosFormat());System.exit(0);}}}
}

结果如下:

这些是忽略了遗漏的结果:

  • 时间以微秒为单位。
  • 延迟分布在图的顶部。
  • 此测试中的争用意味着要使用4个线程运行该程序。
  • 测试在具有8个逻辑CPU的MBP i7上运行。
  • 每个测试包括200,000,000次迭代和10,000次迭代预热。
  • 调整协调遗漏时的吞吐量为1迭代/微秒。

屏幕截图2015-08-11 at 14.21.20

正如预期的那样,在没有争用的情况下,结果几乎相同。 JIT将优化锁定并进行同步。

在较低的百分位数中,使用Lock进行争用稍微快一些,但实际上又不是很多。 因此,即使有许多较小的垃圾收集,它们似乎也没有显着降低锁的速度。 如果有的话,总体上Lock会稍微快一点。

这些是为协调省略而调整的结果。

屏幕快照2015-08-11 at 14.34.10

这些数字当然更高,因为它们考虑了引起的真正延迟。

同样,在没有争用的情况下,锁和同步执行相同的操作–在那里没有很大的惊喜。

有了争用,现在我们可以看到高达99%的百分比的同步锁定性能超出10倍。 之后,时间几乎相同。

我可以推测,与同步相比,gc集合的影响(介于300-1200微秒之间)是导致锁缓慢的原因。 尤其是因为速度下降仅出现到第99个百分位时才明显–在此之后,延迟可能会降到硬件和操作系统上。 但是,这只是我的推测,无需进一步调查。

结论

这篇文章的收获更多是关于衡量和分析延迟的过程。 有趣的是, Lock在竞争时进行分配,但不太可能在现实世界中产生任何实际变化

翻译自: https://www.javacodegeeks.com/2015/08/a-case-study-in-analysing-latency-lock-vs-synchronized.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/357669.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

思维脑图——数据分析实战(最新版)

导读:数据分析是指用适当的统计分析方法对收集来的大量数据进行分析,提取有用信息和形成结论而对数据加以详细研究和概括总结的过程。 在统计学领域,将数据分析划分为描述性统计分析、探索性数据分析以及验证性数据分析,探索性数据分析侧重于在数据之中发现新的特征,而验证…

java servlet jsp javabean关系图,一个关于javaBean+servlet+jsp的MVC架构有关问题

当前位置:我的异常网 Java Web开发 一个关于javaBeanservletjsp的MVC架构有关问题一个关于javaBeanservletjsp的MVC架构有关问题www.myexceptions.net 网友分享于&#xff1a;2013-01-14 浏览&#xff1a;13次一个关于javaBeanservletjsp的MVC架构问题//jsp的代码&#xff1…

并发

http://ifeve.com/volatile/转载于:https://www.cnblogs.com/lemon-now/p/5200645.html

java实现一个旅游网站

导读:采用JSP和Java语言以及html脚本语言,同时采用B/S模式,进行各个界面和每个功能的设计与实现,后台管理与设计选用了SQL Server 2005数据库,前台设计与后台管理相结合,共同完成各功能模块的功能。 目录 基本功能 项目结构 项目截图

【收藏】Android屏幕适配全攻略(最权威的Google官方适配指导)

来源&#xff1a;http://blog.csdn.net/zhaokaiqiang1992 更多&#xff1a;Android AutoLayout全新的适配方式&#xff0c; 堪称适配终结者 Android的屏幕适配一直以来都在折磨着我们这些开发者&#xff0c;本篇文章以Google的官方文档为基础&#xff0c;全面而深入的讲解了And…

matlab ode45 二阶微分,matlab关于ode45解二阶微分方程的困惑

matlab关于ode45解二阶微分方程的困惑matlab关于ode45解二阶微分方程的困惑一个二阶微分方程&#xff1a;yyysin(t)初始条件为y(0)5,y(0)6。过程&#xff1a;先降阶为一阶微分方程组yzz-z-ysin(t)编制如下函数m文件function dyweifen(t,x)dyzeros(2,1);%yx(1)%zx(2)dy(1)x(2);d…

java+jsp+sqlserver 2008+Tomcat实现一个简单的搜索引擎

导读:搜索引擎的定义就是指按照既定的策略与方法,采取相关的计算机程序,通过在互联网中进行寻找信息,并显示信息,最后把找到的信息进行整理和筛选,为搜索引擎的使用者提供检索信息的服务,终极目标是为了提供给使用者,他所搜索信息相关的资料的计算机

精通推荐算法1:为什么需要推荐系统(系列文章,建议收藏)

作者简介&#xff1a; 腾讯算法研究员。硕士毕业于中国科学院大学。在阿里和腾讯工作多年&#xff0c;拥有丰富的搜索和推荐算法经验。CSDN博客专家&#xff0c;原创文章100篇。发表专利15个&#xff0c;其中已授权6个。 系列文章&#xff0c;欢迎关注 精通推荐算法1&#x…

mlse均衡器matlab,基于LMS自适应均衡器matlab仿真.doc

基于LMS自适应均衡器matlab仿真.doc毕 业 设 计(2014届)题 目 一种基于OpenCV的摄像机标定方法学 院 物理电气信息学院专 业 电子信息工程年 级 2010学生学号 1201024534学生姓名 李指导教师2014年5月6日摘要关键词&#xff1a;AbstractIn the field of machine vision and ind…

spring 开发环境_设置Spring 3开发环境

spring 开发环境本教程简要说明了如何设置典型的环境来开发基于Spring的应用程序。 除了可以正常工作的Windows XP客户端具有足够的CPU能力和内存外&#xff0c;本教程没有其他先决条件。 在教程中&#xff0c;我们将需要安装以下组件&#xff1a; Java 6 JDK更新26 适用于Jav…

mybaties与hibernate的不同点

hibernate是一个比较完全的ORM框架.而mybaties是一个不完全是一个ORM框架,说mybaties不完全是一个ORM框架是因为sql语句是需要自己写的.但是,mybaties也是有输入映射和输出映射的.因此它也有ORM的思想在,因此说mybaties是一个不完全的ORM框架 而且,mybaties的优胜点在与它的速度…

Java+SSM+Oracle+Navicat+Eclipse+Microsoft Visio实现网上招聘系统

导读:整体基于B/S架构,采用MyBatis框架,运用Java中的Servlet、Jsp等关键技术,并结合Oracle数据库的使用,为招聘者和求职者搭建了一个高效、便利的网络平台。本系统分别为求职者和招聘者提供了信息注册功能,登录功能和信息维护功能。除此之外,求职者可以选择发布、撤销或…

matlab求异面直线的公垂线,求异面直线的公垂线

异面直线间得距离 求异面直线之间得距离就是立体几何重、难点之一。常有利用图形性质,直接找出该公 垂线,然后求解;或者通过空间图形性质,将异面直线距离转化为......求异面直线之间距离的常用策略:求异面直线之间的距离是立体几何重、难点之一。 常有利用图形性质,直接找出该公…

cocoapods 使用时一个问题 (Unable to find a specification for `CYLTableViewPlaceHolder`)

http://blog.csdn.net/zhangao0086/article/details/39703083 这样的问题执行两句代码 :1.pod repo remove master 2.pod setup 这两句代码 把当前Pod的目录清理一下就行了,然后再 pod install 或者 pod update 就可以了转载于:https://www.cnblogs.com/shiguangji728/p/520889…

友盟U-share sdk 分享的接入(支持Android及IOS)

导读:公司的原生开发的APP有块功能原来需要分享小程序到微信,现在改成分享成H5的形式,携带的参数不讨论,这里记录一下。 官方文档:https://developer.umeng.com/docs/128606/detail/129137 安卓分享H5:https://developer.umeng.com/docs/128606/detail/193883#h2-u5206u4E…

从源文件和JAR文件构建Java代码模型

最近&#xff0c;我花了一些时间来研究有效java &#xff0c;该方法正在GitHub上达到300星&#xff08;随时帮助实现目标&#xff1a;D&#xff09;。 Effectivejava是在您的Java代码上运行查询的工具。 它基于我参与的另一个项目javaparser 。 Javaparser将Java源代码作为输入…

nsct matlab,图像融合 NSCT算法 matlab

【实例简介】经典图像融合算法&#xff0c; NSCT算法&#xff0c;为matlab 和 C 混合编译&#xff0c;修改图像地址即可方便使用【实例截图】【核心代码】NSCT└── NSCT_toolbox├── atrousc.c├── atrousc.dll├── atrousc.mexmac├── atrousdec.m├── atrousfilt…

A 标签的背景

a {-webkit-tap-highlight-color: transparent;-webkit-touch-callout: none;-webkit-user-select: none;} 转载于:https://www.cnblogs.com/LLJ748211490/p/5210391.html

前端使用正则表达式获取地址栏URL参数的值并将需要的参数值展示在页面

业务场景:APP中有个H5页面需要分享到微信,用户点击这个消息会跳转到这个网页进行信息确认,然后引导用户下载另一个应用。我们前端工程师需要做的就是将分享的参数在这个网页的地址栏进行获取并展示在信息确认页面。 分享功能请参考我上一篇文章:友盟U-share sdk 分享的接入…

javaScript中const,var,let区别与用法详解

业务场景:今天想从正则表达式数组对象取出几个参数的值,发现好多人都用的const声明的变量,这里一起总结一下吧。 上一篇——》前端使用正则表达式获取地址栏URL参数的值并将需要的参数值展示在页面 场景: 查阅相关资料,总结一下js中三种定义变量的方式const, var, let的…