快速业务通道

Java理论与实践: 并发集合类 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22
onizedMap(new HashMap());   List l = Collections.synchronizedList(new ArrayList());   // put-if-absent idiom -- contains a race condition   // may require external synchronization   if (!map.containsKey(key))    map.put(key, value);   // ad-hoc iteration -- contains race conditions   // may require external synchronization   for (int i=0; i<list.size(); i++) {    doSomething(list.get(i));   }   // normal iteration -- can throw ConcurrentModificationException   // may require external synchronization   for (Iterator i=list.iterator(); i.hasNext(); ) {    doSomething(i.next());   }

信任的错觉

synchronizedList 和 synchronizedMap 提供的有条件的线程安全性也带来 了一个隐患 ―― 开发者会假设,因为这些集合都是同步的,所以它们都是线程 安全的,这样一来他们对于正确地同步混合操作这件事就会疏忽。其结果是尽管 表面上这些程序在负载较轻的时候能够正常工作,但是一旦负载较重,它们就会 开始抛出 NullPointerException 或 ConcurrentModificationException 。

Java理论与实践: 并发集合类(2)

时间:2010-12-21 IBM Brian Goetz

可伸缩性问题

可伸缩性指的是一个应用程序在工作负载和可用处理资源增加时其吞吐量的 表现情况。一个可伸缩的程序能够通过使用更多的处理器、内存或者I/O带宽来 相应地处理更大的工作负载。锁住某个共享的资源以获得独占式的访问这种做法 会形成可伸缩性瓶颈――它使其他线程不能访问那个资源,即使有空闲的处理器 可以调用那些线程也无济于事。为了取得可伸缩性,我们必须消除或者减少我们 对独占式资源锁的依赖。

同步的集合包装器以及早期的 Hashtable 和 Vector 类带来的更大的问题是 ,它们在单个的锁上进行同步。这意味着一次只有一个线程可以访问集合,如果 有一个线程正在读一个 Map ,那么所有其他想要读或者写这个 Map 的线程就必 须等待。最常见的 Map 操作, get() 和 put() ,可能比表面上要进行更多的 处理――当遍历一个hash表的bucket以期找到某一特定的key时, get() 必须对 大量的候选bucket调用 Object.equals() 。如果key类所使用的 hashCode() 函 数不能将value均匀地分布在整个hash表范围内,或者存在大量的hash冲突,那 么某些bucket链就会比其他的链长很多,而遍历一个长的hash链以及对该hash链 上一定百分比的元素调用 equals() 是一件很慢的事情。在上述条件下,调用 get() 和 put() 的代价高的问题不仅仅是指访问过程的缓慢,而且,当有线程 正在遍历那个hash链时,所有其他线程都被锁在外面,不能访问这个 Map 。

(哈希表根据一个叫做hash的数字关键字(key)将对象存储在bucket中。 hash value是从对象中的值计算得来的一个数字。每个不同的hash value都会创 建一个新的bucket。要查找一个对象,您只需要计算这个对象的hash value并搜 索相应的bucket就行了。通过快速地找到相应的bucket,就可以减少您需要搜索 的对象数量了。译者注)

get() 执行起来可能会占用大量的时间,而在某些情况下,前面已经作了讨 论的有条件的线程安全性问题会让这个问题变得还要糟糕得多。 清单1 中演示 的争用条件常常使得对单个集合的锁在单个操作执行完毕之后还必须继续保持一 段较长的时间。如果您要在整个迭代期间都保持对集合的锁,那么其他的线程就 会在锁外停留很长的一段时间,等待解锁。

实例:一个简单的cache

Map 在服务器应用中最常见的应用之一就是实现一个 cache。 服务器应用可 能需要缓存文件内容、生成的页面、数据库查询的结果、与经过解析的XML文件 相关的

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号