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

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

ID:15420269

大小:42.00 KB

页数:5页

时间:2018-08-03

你所不知道的五件事情(并发多线程编程)_第1页
你所不知道的五件事情(并发多线程编程)_第2页
你所不知道的五件事情(并发多线程编程)_第3页
你所不知道的五件事情(并发多线程编程)_第4页
你所不知道的五件事情(并发多线程编程)_第5页
资源描述:

《你所不知道的五件事情(并发多线程编程)》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、你所不知道的五件事情(并发多线程编程)这是TedNeward在IBMdeveloperWorks中5things系列文章中的一篇,讲述了关于Java并发集合API的一些应用窍门,值得大家学习。(2010.05.24最后更新)   摘要:编写既要性能良好又要防止应用崩溃的多线程代码确实很难--这也正是我们需要java.util.concurrent的原因。TedNeward向你展示了像CopyOnWriteArrayList,BlockingQueue和ConcurrentMap这样的并发集合类是如何为了并发编程需要

2、而改进标准集合类的。   并发集合API是Java5的一大新特性,但由于对Annotation和泛型的热捧,许多Java开发者忽视了这些API。另外(可能更真实的是),因为许多开发者猜想并发集合API肯定很复杂,就像去尝试解决一些问题那样,所以开发者们会回避java.util.concurrent包。   事实上,java.util.concurrent的很多类并不需要你费很大力就能高效地解决通常的并发问题。继续看下去,你就能学到java.util.concurrent中的类,如CopyOnWriteArrayLi

3、st和BlockingQueue,是怎样帮助你解决多线程编程可怕的挑战。1.TimeUnit   java.util.concurrent.TimeUnit本身并不是集合框架类,这个枚举使得代码非常易读。使用TimeUnit能够将开发者从与毫秒相关的困苦中解脱出来,转而他们自己的方法或API。   TimeUnit能与所有的时间单元协作,范围从毫秒和微秒到天和小时,这就意味着它能处理开发者可能用到的几乎所有时间类型。还要感谢这个枚举类型声明的时间转换方法,当时间加快时,它甚至能细致到把小时转换回毫秒。2.CopyO

4、nWriteArrayList   制作数组的干净复本是一项成本极高的操作,在时间和内存这两方面均有开销,以至于在通常的应用中不能考虑该方法;开发者常常求助于使用同步的ArrayList来替代前述方法。但这也是一个比较有代价的选项,因为当每次你遍历访问该集合中的内容时,你不得不同步所有的方法,包括读和写,以确保内存一致性。   在有大量用户在读取ArrayList而只有很少用户对其进行修改的这一场景中,上述方法将使成本结构变得缓慢。   CopyOnWriteArrayList就是解决这一问题的一个极好的宝贝工具。

5、它的Javadoc描述到,ArrayList通过创建数组的干净复本来实现可变操作(添加,修改,等等),而CopyOnWriteArrayList则是ArrayList的一个"线程安全"的变体。   对于任何修改操作,该集合类会在内部将其内容复制到一个新数组中,所以当读用户访问数组的内容时不会招致任何同步开销(因为它们没有对可变数据进行操作)。   本质上,创建CopyOnWriteArrayList的想法,是出于应对当ArrayList无法满足我们要求时的场景:经常读,而很少写的集合对象,例如针对JavaBean事

6、件的Listener。3.BlockingQueue   BlockingQueue接口表明它是一个Queue,这就意味着它的元素是按先进先出(FIFO)的次序进行存储的。以特定次序插入的元素会以相同的次序被取出--但根据插入保证,任何从空队列中取出元素的尝试都会堵塞调用线程直到该元素可被取出时为止。同样地,任何向一个已满队列中插入元素的尝试将会堵塞调用线程直到该队列的存储空间有空余时为止。   在不需要显式地关注同步问题时,如何将由一个线程聚集的元素"交给"另一个线程进行处理呢,BlockingQueue很灵巧地

7、解决了这个问题。JavaTutorial中GuardedBlocks一节是很好的例子。它使用手工同步和wait()/notifyAll()方法创建了一个单点(single-slot)受限缓冲,当一个新的元素可被消费且当该点已经准备好被一个新的元素填充时,该方法就会在线程之间发出信号。(详情请见GuardedBlocks)   尽管教程GuardedBlocks中的代码可以正常工作,但它比较长,有些凌乱,而且完全不直观。诚然,在Java平台的早期时代,Java开发者们不得不;但现在已经是2010年了--问题已经得到改

8、进?   清单1展示的程序重写了GuardedBlocks中的代码,其中我使用ArrayBlockingQueue替代了手工编写的Drop。清单1.BlockingQueueimport java.util.*;import java.util.concurrent.*;class Producer    implements Runnable{    pr

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

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

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