深入剖析ConcurrentHashMap(2)
经过之前的铺垫,现在可以进入正题了。 我们关注的操作有:get,put,remove 这3个操作。 对于哈希表,Java中采用链表的方式来解决hash冲突的。 一个HashMap的数据结构看起来类似下图: 实现了同步的HashTable也是这样的结构,它的同步使用锁来保证的,并且所有同步操作使用的是同一个锁对象。这样若有n个线程同时在get时,这n个线程要串行的等待来获取锁。...
View Article不正当使用HashMap导致cpu 100%的问题追究
因最近hashmap误用引起的死循环又发生了一些案例,左耳朵浩子写了一篇blog 疫苗:Java HashMap的死循环,看了一下,大家的分析如出一辙。这篇blog也是好几年前写的了,之前在平台技术部的博客上贴过,随着组织结构的调整,那个博客可能不再维护,把这篇文章在这儿也保存一下。 李鹏同学在blog里写了篇关于HashMap死锁模拟的文章:...
View Article分享ppt: java7里的fork-join
以前分享的ppt,介绍了java7里的fork-join框架; 从slideshare下载,或从微盘下载 work-stealing在很多框架里都出现过,从两张图能大致看明白: 原创文章,转载请注明: 转载自并发编程网 – ifeve.com 本文链接地址: 分享ppt: java7里的fork-join
View ArticleTomcat进程意外退出的问题分析
感谢同事宏江投递本稿。 节前某个部门的测试环境反馈tomcat会意外退出,我们到实际环境排查后发现不是jvm crash,日志里有进程销毁的记录,从pause到destory的整个过程: org.apache.coyote.AbstractProtocol pause Pausing ProtocolHandler org.apache.catalina.core.StandardService...
View Article如何合理地估算线程池大小?
感谢网友【蒋小强】投稿。 如何合理地估算线程池大小? 这个问题虽然看起来很小,却并不那么容易回答。大家如果有更好的方法欢迎赐教,先来一个天真的估算方法:假设要求一个系统的TPS(Transaction Per Second或者Task Per Second)至少为20,然后假设每个Transaction由一个线程完成,继续假设平均每个线程处理一个Transaction的时间为4s。那么问题转化为:...
View Article上下文切换与多处理器
对于进程有两个幻觉:一认为自己独享内存;二以为自己独享处理器。我们对于一台机器上的多个进程的幻觉是感觉他们是同时运行。 我们来依次解释下上面的三个幻觉:...
View ArticleBug:LinkedTransferQueue的数据暂失和CPU爆满以及修复
一个因中断或者超时的调用可能会引起数据丢失和CPU爆满。 前几天读LinkedTransferQueue(以下简称ltq)的源码,想加深下对松弛型双重队列的理解,无意中发现了这个问题:),经过仔细检查后确认了这是个bug,存在于JDK1.7.0_40和刚发布的JDK8中,去google和oracle官方似乎也没有搜索到这个问题。...
View ArticleJava SE 8 在并发工具方面的加强
本文首发于InfoQ。 Java 8在Lambda表达式、接口默认方式、新的日期API等方面引入的新特性广受关注,同时在并发编程方面也做出了大量改进。以往的几个Java版本都对java.util.concurrent做了不同程度的增强,比如Java 7的Fork/Join框架,而Java...
View ArticleJVM的重排序
感谢同事【沐剑】的投稿 重排序通常是编译器或运行时环境为了优化程序性能而采取的对指令进行重新排序执行的一种手段。重排序分为两类:编译期重排序和运行期重排序,分别对应编译时和运行时环境。...
View Article面向GC的Java编程
感谢同事【沐剑】的投稿 Java程序员在编码过程中通常不需要考虑内存问题,JVM经过高度优化的GC机制大部分情况下都能够很好地处理堆(Heap)的清理问题。以至于许多Java程序员认为,我只需要关心何时创建对象,而回收对象,就交给GC来做吧!甚至有人说,如果在编程过程中频繁考虑内存问题,是一种退化,这些事情应该交给编译器,交给虚拟机来解决。...
View Article华东地区scala爱好者聚会(2014上海)
感谢看处方的汪院长和烨明,为这次活动提供了场地和零食,去年在上海的scala聚会也是看处方的汪院长发起的。这次聚会人比上次略微多一些了,而且整体水平是不断提升的。 聚石分享了来往使用scala构建通讯的一些经验,来往的IM部分采用自己的协议(有些类似spdy,要简单很多),在协议网关的实现上主要使用scala、akka,他主要分享了这个过程中踩过的一些坑。...
View ArticleTomcat对keep-alive的实现逻辑
Tomcat的connector实现逻辑蛮复杂的,有很多种状态总记不住,每次遇到网络相关的问题都要翻一遍代码,这次结合一个案例看看tomcat的三种connector的实现方式。...
View Article云架构和openstack的思考
作者:罗立树 最近在负责公司内部私有云的建设,一直在思考怎么搞云计算,怎么才能够把云架构设计得好一些。 本文章主要内容: 1. 行业生态 2. 从需求角度看云 3. 云计算概述 4. 云建设的关键问题 5. 私有云架构规划 一.行业生态 计算机云经过多年的发展,由一开始的概念,慢慢发展成熟并能够推向市场,提供多种多样的服务,市场空间非常之大。...
View ArticleTomcat-connector的微调(1): acceptCount参数
对于acceptCount这个参数,含义跟字面意思并不是特别一致(个人感觉),容易跟maxConnections,maxThreads等参数混淆;实际上这个参数在tomcat里会被映射成backlog: static { replacements.put("acceptCount", "backlog"); replacements.put("connectionLinger",...
View ArticleTomcat-connector的微调(2): maxConnections, maxThreads
1) 最大连接数 tomcat的最大连接数参数是maxConnections,这个值表示最多可以有多少个socket连接到tomcat上。BIO模式下默认最大连接数是它的最大线程数(缺省是200),NIO模式下默认是10000,APR模式则是8192(windows上则是低于或等于maxConnections的1024的倍数)。如果设置为-1则表示不限制。...
View ArticleTomcat-connector的微调(3): processorCache与socket.processorCache
tomcat在处理每个连接时,Acceptor角色负责将socket上下文封装为一个任务SocketProcessor然后提交给线程池处理。在BIO和APR模式下,每次有新请求时,会创建一个新的SocketProcessor实例(在之前的tomcat对keep-alive的实现逻辑里也介绍过可以简单的通过SocketProcessor与SocketWrapper实例数对比socket的复用情况);而...
View ArticleJava锁的种类以及辨析(二):自旋锁的其他种类
作者:山鸡 锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized 和 ReentrantLock等等 ) 。这些已经写好提供的锁为我们开发提供了便利,但是锁的具体性质以及类型却很少被提及。本系列文章将分析JAVA下常见的锁名称以及特性,为大家答疑解惑。 2.自旋锁的其他种类 上篇我们讲到了自旋锁,在自旋锁中 另有三种常见的锁形式:TicketLock...
View ArticleJava锁的种类以及辨析(三):阻塞锁
作者:山鸡 锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized 和 ReentrantLock等等 ) 。这些已经写好提供的锁为我们开发提供了便利,但是锁的具体性质以及类型却很少被提及。本系列文章将分析JAVA下常见的锁名称以及特性,为大家答疑解惑。 三、阻塞锁: 阻塞锁,与自旋锁不同,改变了线程的运行状态。...
View Article并发网2014.11月阅读量Top10
又到了月末,并发网11月Top10的阅读量的文章送到,希望各位客官笑纳!有任何意见和建议,欢迎告诉我们,我们在努力!~ Top1 JAVA面试700问(一) Java环境中的字节码是什么?由Java 编译器生成的一种代码。由JVM生成的一种代码,Java源文件(Java Source File)的别名,一种写在类的实例方法中的代码,答案……(1502人阅读) Top2 完美的单例实现(The...
View ArticleJava8中CAS的增强
几天前,我偶然地将之前写的用来测试AtomicInteger和synchronized的自增性能的代码跑了一下,意外地发现AtomicInteger的性能比synchronized更好了,经过一番原因查找,有了如下发现: 在jdk1.7中,AtomicInteger的getAndIncrement是这样的: public final int getAndIncrement() { for (;;)...
View Article