探索concurrenthashmap高并发性的实现机制-java开发java经验技巧

探索concurrenthashmap高并发性的实现机制-java开发java经验技巧

ID:33038766

大小:122.51 KB

页数:16页

时间:2019-02-19

探索concurrenthashmap高并发性的实现机制-java开发java经验技巧_第1页
探索concurrenthashmap高并发性的实现机制-java开发java经验技巧_第2页
探索concurrenthashmap高并发性的实现机制-java开发java经验技巧_第3页
探索concurrenthashmap高并发性的实现机制-java开发java经验技巧_第4页
探索concurrenthashmap高并发性的实现机制-java开发java经验技巧_第5页
资源描述:

《探索concurrenthashmap高并发性的实现机制-java开发java经验技巧》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、探索ConcurrcntHashMap高并发性的实现机制-编程开发技术探索ConcurrentHashMap高并发性的实现机制原文出处:IBM程晓明简介ConcurrentHashMap是liti1.concurrent包的重耍成员。木文将结合Java内存模型,分析JDK源代码,探索ConcurrentHashMap高并发的具体实现机制。由于ConcurrentHashMap的源代码实现依赖于Java内存模型,所以阅读木文需耍读者了解Java内存模型。同时,ConcurrentHashMap的源代码会涉及到散列算法和链

2、表数据结构,所以,读者需要对散列算法和基于链表的数据结构有所了解。Java内存模型由于ConcurrentHashMap是建立在Java内存模型基础上的,为了更好的理解ConcurrentHashMap,让我们首先來了解一下Java的内存模型。Java语言的内存模型由一些规则组成,这些规则确定线程对内存的访问如何排序以及何时口J以确保它们对线程是町见的。下面我们将分别介绍Java内存模型的重排序,内存可见性和happens-bcforc关系。重排序内存模型描述了程序的可能行为。具体的编译器实现可以产生任意它喜欢的代码—

3、只要所有执行这些代码产生的结果,能够和内存模型预测的结果保持一致。这为编译器实现者提供了很大的自由,包括操作的重排序。编译器生成指令的次序,可以不同于源代码所暗示的“显然”版本。重排序后的指令,对于优化执行以及成熟的全局寄存器分配算法的使用,都是大有脾益的,它使得程序在计算性能上有了很大的提升。重排序类型包括:•编译器生成指令的次序,可以不同于源代码所暗示的“显然”版本。•处理器可以乱序或者并行的执行指令。•缓存会改变写入捉交到主内存的变量的次序。内存可见性由于现代可共享内存的多处理器架构可能导致一个线程无法马上(甚至

4、永远)看到另一个线程操作产生的结果。所以Java内存模型规定了JVM的一种最小保证:什么时候写入一个变量对其他线程可见。在现代可共享内存的多处理器体系结构中每个处理器都有口己的缓存,并周期性的与主内存协调一致。假设线程A写入一个变量值V,随后另一个线程B读取变量V的值,在下列情况下,线程B读取的值可能不是线程A写入的最新值:•执行线程A的处理器把变量V缓存到寄存器屮。•执行线程A的处理器把变量V缓存到自己的缓存屮,但还没有同步刷新到主内存中去。•执行线程B的处理器的缓存中有变量V的IH值。Happens-before关

5、系happens-before关系保证:如果线程A与线程B满足happens-before关系,则线程A执行动作的结果对于线程B是可见的。如果两个操作未按happens-before排序,JVM将可以对他们任意重排序。下面介绍儿个与理解ConcurrentHashMap有关的happens-before关系法则:1.程序次序法则:如果在程序中,所有动作A出现在动作BZ前,则线程中的每动作A都happcns-bcforc于该线程中的每一个动作B。2.监视器锁法则:对一个监视器的解锁happens-before于每个后续对

6、同--监视器的加锁。3.Volatile变量法则:对Volatile域的写入操作happens-before于每个后续对同一Volatile的读操作。4.传递性:如果Ahappens-before于B,且Bhappens-beforeC,则Ahappens-beforeCoConcurrentHashMap的结构分析为了更好的理解ConcurrentHashMap高并发的具体实现,让我们先探索它的结构模型。ConcurrentHashMap类屮包含两个静态内部类HashEntry和SegmentoHashEntry用来

7、封装映射表的键/值对;Segment用来充当锁的角色,每个Segment对象守护整个散列映射表的若HF个桶。每个桶是由若个HashEntry对象链接起来的链农。一个ConcurrentHashMap实例中包含市若干个Segment对象组成的数组。HashEntry类HashEntry用來封装散列映射表中的键值对。在HashEntry类中,key,hash和next域都被声明为final型,value域被声明为volatile型。清单1.HashEntry类的定义finalKkey;finalinthash;volati

8、leVvalue;//声明key为final型staticfinalclassIlashEntry{//声明hash值为final型//声明value为volat订e型finalHashEntrynext;//声明next为final型HashEntry(Kkey,inthash,HashEntryn

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。