你所不知道的五件事情(并发多线程编程).docVIP

你所不知道的五件事情(并发多线程编程).doc

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
你所不知道的五件事情(并发多线程编程) 这是Ted Neward在IBM developerWorks中5 things系列文章中的一篇,讲述了关于Java并发集合API的一些应用窍门,值得大家学习。(2010.05.24最后更新) ??? 摘要:编写既要性能良好又要防止应用崩溃的多线程代码确实很难--这也正是我们需要java.util.concurrent的原因。Ted Neward向你展示了像CopyOnWriteArrayList,BlockingQueue和ConcurrentMap这样的并发集合类是如何为了并发编程需要而改进标准集合类的。 ??? 并发集合API是Java 5的一大新特性,但由于对Annotation和泛型的热捧,许多Java开发者忽视了这些API。另外(可能更真实的是),因为许多开发者猜想并发集合 API肯定很复杂,就像去尝试解决一些问题那样,所以开发者们会回避java.util.concurrent包。 ??? 事实上,java.util.concurrent的很多类并不需要你费很大力就能高效地解决通常的并发问题。继续看下去,你就能学到 java.util.concurrent中的类,如CopyOnWriteArrayList和BlockingQueue,是怎样帮助你解决多线程编程可怕的挑战。 1. TimeUnit ??? java.util.concurrent.TimeUnit本身并不是集合框架类,这个枚举使得代码非常易读。使用TimeUnit能够将开发者从与毫秒相关的困苦中解脱出来,转而他们自己的方法或API。 ??? TimeUnit能与所有的时间单元协作,范围从毫秒和微秒到天和小时,这就意味着它能处理开发者可能用到的几乎所有时间类型。还要感谢这个枚举类型声明的时间转换方法,当时间加快时,它甚至能细致到把小时转换回毫秒。 2. CopyOnWriteArrayList ??? 制作数组的干净复本是一项成本极高的操作,在时间和内存这两方面均有开销,以至于在通常的应用中不能考虑该方法;开发者常常求助于使用同步的 ArrayList来替代前述方法。但这也是一个比较有代价的选项,因为当每次你遍历访问该集合中的内容时,你不得不同步所有的方法,包括读和写,以确保内存一致性。 ??? 在有大量用户在读取ArrayList而只有很少用户对其进行修改的这一场景中,上述方法将使成本结构变得缓慢。 ??? CopyOnWriteArrayList就是解决这一问题的一个极好的宝贝工具。它的Javadoc描述到,ArrayList通过创建数组的干净复本来实现可变操作(添加,修改,等等),而CopyOnWriteArrayList则是ArrayList的一个线程安全的变体。 ??? 对于任何修改操作,该集合类会在内部将其内容复制到一个新数组中,所以当读用户访问数组的内容时不会招致任何同步开销(因为它们没有对可变数据进行操作)。 ??? 本质上,创建CopyOnWriteArrayList的想法,是出于应对当ArrayList无法满足我们要求时的场景:经常读,而很少写的集合对象,例如针对JavaBean事件的Listener。 3. BlockingQueue ??? BlockingQueue接口表明它是一个Queue,这就意味着它的元素是按先进先出(FIFO)的次序进行存储的。以特定次序插入的元素会以相同的次序被取出--但根据插入保证,任何从空队列中取出元素的尝试都会堵塞调用线程直到该元素可被取出时为止。同样地,任何向一个已满队列中插入元素的尝试将会堵塞调用线程直到该队列的存储空间有空余时为止。 ??? 在不需要显式地关注同步问题时,如何将由一个线程聚集的元素交给另一个线程进行处理呢,BlockingQueue很灵巧地解决了这个问题。Java Tutorial中Guarded Blocks一节是很好的例子。它使用手工同步和wait()/notifyAll()方法创建了一个单点(single-slot)受限缓冲,当一个新的元素可被消费且当该点已经准备好被一个新的元素填充时,该方法就会在线程之间发出信号。(详情请见Guarded Blocks) ??? 尽管教程Guarded Blocks中的代码可以正常工作,但它比较长,有些凌乱,而且完全不直观。诚然,在Java平台的早期时代,Java开发者们不得不;但现在已经是 2010年了--问题已经得到改进? ??? 清单1展示的程序重写了Guarded Blocks中的代码,其中我使用ArrayBlockingQueue替代了手工编写的Drop。 清单1. BlockingQueue import?java.util.*; import?java.util.

文档评论(0)

yan666888 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档