快速业务通道

Java理论与实践: 构建一个更好的HashMap - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22
于所有其他线程立即可 见。有两种语言机制可用于保证跨线程内存操作的一致性―― synchronized 和 volatile。

按照 JLS的说法,“在没有显式同步的情况下,一个实现可以自由地更新主 存,更新时所采取的顺序可能是出人意料的。”其意思是说,如果没有同步的话 ,在一个给定线程中某种顺序的写操作对于另外一个不同的线程来说可能呈现出 不同的顺序, 并且对内存变量的更新从一个线程传播到另外一个线程的时间是 不可预测的。

虽然使用同步最常见的原因是保证对代码关键部分的原子访问,但实际上同 步提供三个独立的功能――原子性、可见性和顺序性。原子性非常简单――同步 实施一个可重入的(reentrant)互斥,防止多于一个的线程同时执行由一个给 定的监视器保护的代码块。不幸的是,多数文章都只关注原子性方面,而忽略了 其他方面。但是同步在JMM 中也扮演着很重要的角色,会引起 JVM 在获得和释 放监视器的时候执行内存壁垒(memory barrier)。

一个线程在获得一个监视器之后,它执行一个 读屏障(read barrier)―― 使得缓存在线程局部内存(比如说处理器缓存或者处理器寄存器)中的所有变量 都失效,这样就会导致处理器重新从主存中读取同步代码块使用的变量。与此类 似,在释放监视器时,线程会执行一个 写屏障(write barrier)――将所有修 改过的变量写回主存。互斥独占和内存壁垒结合使用意味着只要您在程序设计的 时候遵循正确的同步法则(也就是说,每当写一个后面可能被其他线程访问的变 量,或者读取一个可能最后被另一个线程修改的变量时,都要使用同步),每个 线程都会得到它所使用的共享变量的正确的值。

如果在访问共享变量的时候没有同步的话,就会发生一些奇怪的事情。一些 变化可能会通过线程立即反映出来,而其他的则需要一些时间(这由关联缓存的 本质所致)。结果,如果没有同步您就不能保证内存内容必定一致(相关的变量 相互间可能会不一致),或者不能得到当前的内存内容(一些值可能是过时的) 。避免这种危险情况的常用方法(也是推荐使用的方法)当然是正确地使用同步 。然而在有些情况下,比如说在像 ConcurrentHashMap 之类的一些使用非常广 泛的库类中,在开发过程当中还需要一些额外的专业技能和努力(可能比一般的 开发要多出很多倍)来获得较高的性能。

Java理论与实践: 构建一个更好的HashMap(2)

时间:2010-12-21 IBM Brian Goetz

ConcurrentHashMap 实现

如前所述, ConcurrentHashMap 使用的数据结构与 Hashtable 或 HashMap 的实现类似,是 hash bucket的一个可变数组,每个 ConcurrentHashMap 都由 一个 Map.Entry 元素链构成,如清单1所示。与 Hashtable 和HashMap 不同的 是, ConcurrentHashMap 没有使用单一的集合锁(collection lock),而是使 用了一个固定的锁池,这个锁池形成了bucket 集合的一个分区。

清单1. ConcurrentHashMap 使用的 Map.Entry 元素

protected static class Entry implements Map.Entry {    protected final Object key;    protected volatile Object value;    protected final int hash;    protected final Entry next;    ... }

不用锁定遍历数据结构

与 Hashtable 或者典型的锁池 Map 实现不同, ConcurrentHashMap.get() 操作不一定需要获取与相关bucket 相关联的锁。如果不使用锁定,那么实现必 须有能力处理它用到的所有变量的过时的或者不一致的值,比如说列表头指针和 Map.Entry 元素的域(包括组成每个 hash bucket 条目的链表的链接指针)。

大多并发类使用同步来保证独占式访问一个数据结构(以及保持数据结构的 一致性)。 ConcurrentHashMap 没有采用独占性和一致性,它使用的链表是经 过精心

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号