java 对象锁定_少锁定Java对象池

java 对象锁定

自从我写任何东西以来已经有一段时间了,我一直在忙于我的新工作,其中涉及在性能调优方面做一些有趣的工作。 挑战之一是减少应用程序关键部分的对象创建。

尽管Java随着时间的推移已改进了GC算法,但垃圾回收打ic一直是Java的主要难题。 Azul是开发无暂停GC的市场领导者,但Azul JVM并非免费!

创建过多的临时/垃圾对象并不能很好地工作,因为它为GC创建了工作,并且将对延迟产生负面影响。 过多的垃圾也不能在多核系统上正常工作,因为它会导致缓存污染。

那么我们应该如何解决呢?

垃圾少编码

仅当您知道需要多少个对象并预先分配它们时,这才有可能,但是实际上很难找到。 但是即使您成功做到了,也必须担心另一个问题

  • 您可能没有足够的内存来容纳所需的所有对象
  • 您还必须处理并发

那么上述问题的解决方案是什么

有一种对象池设计模式可以解决以上两个问题。 它使您可以指定池中所需的许多对象,并处理并发请求以服务所请求的对象。

对象池一直是许多具有低延迟要求的应用程序的基础。 Flyweight设计模式是对象池的一种风格。

上面的两种模式都将帮助我们避免创建对象。 太好了,因此现在减少了GC工作,并且理论上我们的应用程序性能应该得到改善。 实际上,不会那样做,因为对象池/ Flyweight必须处理并发,并且由于并发问题而失去了避免对象创建而获得的任何优势。

处理并发的最常见方法是什么

对象池是一个典型的生产者/消费者问题,可以使用以下技术来解决:

同步:这是在JDK 1.5之前处理并发的唯一方法。 Apache编写了一个基于同步的出色的对象池 API

锁: Java在JDK 1.5之后增加了对并发编程的出色支持。 已经有一些使用锁来开发对象池的工作,例如, furious-objectpool

无锁:我找不到使用完全无锁技术构建的任何实现,但是furious-objectpool使用ArrayBlocking队列和ConcurrentLinked队列的混合

衡量绩效

在此测试中,我创建了一个包含100万个对象的池,并且这些对象可以通过不同的池实现进行访问,这些对象将从池中取出并返回到池中。

该测试首先从1个线程开始,然后增加线程数以衡量不同池在争用情况下的执行情况

  • X轴–螺纹数
  • Y轴–以毫秒为单位的时间–越短的时间越好

该测试包括来自Apache的池,Furious池和基于ArrayBlocking的池

Apache的性能最差,并且随着线程数量的增加,性能会进一步下降。 原因是Apache池基于大量使用“同步”

其他两个(基于Furious和ArrayBlocking的池)的性能更好,但是随着争用的增加,它们两者的速度也会降低。

当12个线程试图访问该池时,基于ArrayBlocking队列的池对于100万个项目大约需要1000毫秒。 内部使用Arrayblocking队列的愤怒池大约需要1975 ms。

我必须进行更详细的调查,以找出为什么Furious花费双倍的时间,因为它也是基于ArrayBlocking队列的。

数组阻塞队列的性能不错,但这是一种基于锁定的方法。 如果可以实现无锁池,我们将获得哪种类型的性能?

锁免费游泳池

实现无锁池不是不可能的,但是有点困难,因为您必须处理多个生产者和消费者。

我将实现一个混合池,该池将在生产者端使用锁定,而在消费者端使用非阻塞技术。

让我们看一些数字

我使用新的实现(FastPool)进行了相同的测试,它比ArayBlocking队列快了30%。

30%的改善还不错,它绝对可以帮助我们实现延迟目标。

是什么让快速池快速!

我使用了两种技术来使其快速运行

  • 生产者是基于锁的–使用锁来管理多个生产者,这与“数组阻止”队列相同,因此没什么大不了的。
  • 立即发布已发布项目–在使用便宜的内存屏障释放锁之前,它会发布元素。 这会有所收获
  • 消费者不受阻碍–使用CAS来实现这一目标,消费者永远不会因生产者而受到阻碍。 数组阻止队列阻止使用者,因为它对生产者和使用者使用相同的锁
  • 线程局部以保持值的局部性–线程局部用于获取最后使用的值,这在很大程度上减少了争用。

如果您有兴趣查看代码,则可以使用@ FastObjectPool.java

参考:来自Are you ready博客的JCG合作伙伴 Ashkrit Sharma的Lockless Java Object Pool 。

翻译自: https://www.javacodegeeks.com/2013/07/lock-less-java-object-pool.html

java 对象锁定

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

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

相关文章

php怎么检查输入名称,PHP |通过$_POST []获取输入名称

HTML示例:用户填写输入字段:dfgdfg.comecho $_POST[email]; //output: dfgdfg.com表单中每个输入的名称和值都将发送到服务器.有没有办法获得名称属性?所以像..echo $_POST[email].name; //output: email编辑:澄清对我的问题的一些…

使用Speedment 3.0.17及更高版本简化交易

交易次数 有时我们想确保我们的数据库操作是原子执行的,并且与其他操作分开。 这是交易起作用的地方。 交易是一组操作 数据库可能接受或不接受作为原子操作的建议。 因此,要么接受交易中的所有操作,要么不接受交易中的所有操作。 事务的另一…

图像二值化 php im2bw,图像二值化-MATLAB实现

1.图像二值化代码:Aimread(hw1.chips1.GIF); %读取到一张图片%thresh graythresh(A); %自动确定二值化阈值I2 im2bw(A,120/255); %对图像二值化figure();subplot(1,2,1);imshow(A); %显示二值化之前的图片title(原图);subplot(1,2,2);imshow(I2); %显示二值化之后…

Linux操作系统基础

前言 当涉及到计算机操作系统时,Linux 是一个备受关注和广泛使用的开源操作系统。Linux 操作系统以其灵活性、可定制性和强大的性能而闻名,并且在各个领域都有广泛的应用,从服务器和嵌入式设备到个人电脑和移动设备。 本文将介绍 Linux 操作…

php laravel 调试,php – Xdebug laravel artisan命令

我经常使用xdebug来调试应用程序,我已经构建了一个laravel应用程序,它可以上传一个csv,将数据插入到数据库中,并将id输入到作业队列中.我写了一个工匠命令,通过cron运行,然后对这些数据做一些事情.Xdebug适用于通过浏览器访问该站点,但从cli运行时它不会破坏断点.我运行php5-fp…

Spring MVC:高级会话

不久前,我写了一篇关于Spring MVC应用程序中HTTP会话的文章。 那是简单的文章,着重于用法的实际方面。 在文章的最后,我保证会写一些更高级的主题,专门针对Spring MVC应用程序中的会话。 因此,我将发布这些东西。 在开…

php node 目录,node.js基于fs模块对系统文件及目录进行读写操作的方法详解

本文主要介绍了node.js基于fs模块对系统文件及目录进行读写操作的方法,结合实例形式分析了nodejs使用fs模块针对文件与目录的读写、创建、删除等相关操作技巧,需要的朋友可以参考下。如果要用这个模块,首先需要引入,fs已经属于node.js自带的模块&#xf…

Oracle JDBC中的PreparedStatement占位符过多

使用Oracle数据库时,导致ORA-01745(“无效的主机/绑定变量名称错误”)错误的原因有多种。 关于错误ORA-01500到ORA-02098的Oracle 9i文档提供了有关ORA-01745的更多详细信息。 它指出,“原因”是“绑定变量或INTO规范中的冒号后跟…

webview加载php文件,HYWebview下载自定义文件教程

车机版 HYWebview升级到1.3了多增加了一个进度条多增加了自定义下载URL功能使用教程。浏览器打开DNS地址:103.44.248.95可见 底部有一个 下载链接 和 提货密码 可以输入!比如 我们去应用宝官网复制下载链接出来:https://download.sj.qq.com/u…

php-fpm7.0,php-fpm7.0 慢查询设置及说明

环境说明rootubuntu:/home/tb# cat /etc/issue Ubuntu 16.04.2 LTS \n \l rootubuntu:/home/tb# php -v PHP 7.0.15-0ubuntu0.16.04.4 (cli) ( NTS ) Copyright (c) 1997-2017 The PHP Group Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies with Zend OPcache…

设计模式 原型模式_设计模式:原型

设计模式 原型模式创新设计模式之一是原型设计模式 。 尽管原型是创造模式,但它在概念上与其他模式有所区别。 我的意思是原型在某种意义上创造了自己。 我将在下面解释。 原型模式的所有魔力都基于Java Object的clone()方法。 因此&#x…

oracle回滚事务的关键字,Oracle ROLLBACK语句(回滚事务)

Oracle ROLLBACK语句(回滚事务)在Oracle中,ROLLBACK语句可以用来撤销当前事务或有问题的事务。本教程就将教大家如何使用ROLLBACK语句。ROLLBACK语法ROLLBACK [ WORK ] [ TO [SAVEPOINT] savepoint_name | FORCE string ];参数WORK:可选的。 它被Oracle添…

借助Fargate和EKS,AWS甚至可以实现Cloud-ier和Kuberneties-ier

在本周的re:Invent大会上,AWS宣布了很多很棒的事情。 您应该检查一下他们的页面 ,以了解他们正在做的所有新工作的概况–内容很多,而且其中很多似乎立即有用。 如果您想了解更多信息,我的同事凯利安德鲁斯(…

oracle sql文字列函数,Oracle 数据库SQL中 decode()函数简介

decode()函数简介:主要作用:将查询结果翻译成其他值(即以其他形式表现出来,以下举例说明);使用方法:Select decode(columnname,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值)From talbenameWhere …其中…

oracle sysnonym,Oracle权限

oracle的权限 oracle的权限一、权限概述权限是用户对一项功能的执行权力。在Oracle中,根据系统管理方式不同,将权限分为系统权限与实体权限两类。系统权限是指是否被授权用户可以连接到数据库上,在数据库中可以进行哪些系统操作。而实体权限是…

java 8 lambda_Java 8 Lambda演练

java 8 lambda在工作中,我进行了有关Java 8项目lambda的演示,当然还提供了一些简单的代码来说明一些要点。 Java 8的总体原因是: 更简洁的代码(适用于只有一种方法和集合的类)。 “我们希望代码阅读者在到达lambda表达…

Php的定界符有哪些了,php中定界符

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼PHP中定界符解析定界符写法如下&#xff1a;echo <<这里可以随便放些什么字符&#xff01;HTML; 实现效果&#xff1a;1.PHP定界符的作用就是按照原样&#xff0c;包括换行格式什么的&#xff0c;输出在其内部的东西&#xf…

在JDK 11中启动单文件源代码程序

JEP 330 –启动单文件源代码程序是即将发布的JDK 11&#xff08;18.9&#xff09;发行版中令人兴奋的功能之一。 此功能允许直接使用java解释器执行Java源代码。 源代码在内存中编译&#xff0c;然后由解释器执行。 限制是必须在同一文件中定义所有类。 对于刚开始学习Java并想…

oracle元字符,正则表达式元字符

[more]1、正则表达式中的元字符元字符 意思 例子说明要匹配的字符是一个特殊字符、常量或者后者引用。(后引用重复上一次的匹配) n 匹配换行符匹配( 匹配 () 匹配 )^ 匹配字符串的开头位置 如果A是字符串的第一个字符&#xff0c;^A 匹配 A$ 匹配字符串的末尾位置 如果B是字符串…

Packt和Java Code Geeks提供的$ 5 Java编程书籍!

您好极客&#xff01; 今天&#xff0c;我们为您带来一些激动人心的消息&#xff01; Java Code Geeks和Packt联手为您提供广泛的书籍库每周折扣。 对于开发人员来说&#xff0c;Java仍然是最强大的选择之一&#xff0c;它是定义企业和移动设备的语言。 本周&#xff0c;我们…