快速业务通道

关于java.util.concurrent您不知道的 5 件事,第1部分 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-13

关于java.util.concurrent您不知道的 5 件事,第1部分

时间:2012-04-24 IBM Ted Neward

通过并发 Collections 进行多线程编程

Concurrent Collections 是 Java™ 5 的巨大附加产品,但是在关于注释和泛型的争 执中很多 Java 开发人员忽视了它们。此外(或者更老实地说),许多开发人员避免使用这个 数据包,因为他们认为它一定很复杂,就像它所要解决的问题一样。

事实上,java.util.concurrent 包含许多类,能够有效解决普通的并发问题,无需复杂工 序。阅读本文,了解 java.util.concurrent 类,比如 CopyOnWriteArrayList 和 BlockingQueue 如何帮助您解决多线程编程的棘手问题。

1. TimeUnit

尽管本质上 不是 Collections 类,但 java.util.concurrent.TimeUnit 枚举让代码更易读懂。使用 TimeUnit 将使用您的方法或 API 的开发人员从毫秒的 “暴政” 中解放出来。

TimeUnit 包括所有时间 单位,从 MILLISECONDS 和 MICROSECONDS 到 DAYS 和 HOURS,这就意味着它能够处理一个开 发人员所需的几乎所有的时间范围类型。同时,因为在列举上声明了转换方法,在时间加快时 ,将 HOURS 转换回 MILLISECONDS 甚至变得更容易。

2. CopyOnWriteArrayList

创建数组的全新副本是过于昂贵的操作,无论是从时间上,还是 从记忆开销上,因此在通常使用中很少考虑;开发人员往往求助于使用同步的 ArrayList。然 而,这也是一个成本较高的选择,因为每当您跨集合内容进行迭代时,您就不得不同步所有操 作,包括读和写,以此保证一致性。

这又让成本结构退回到这样一个场景:很多读者都 在阅读 ArrayList,但是几乎没人会去修改它。

CopyOnWriteArrayList 是个巧妙的小 宝贝,能解决这一问题。它的 Javadoc 将 CopyOnWriteArrayList 定义为一个 “ArrayList 的线程安全变体,在这个变体中所有易变操作(添加,设置等)可以通过复 制全新的数组来实现”。

集合从内部将它的内容复制到一个没有修改的新数组,这样读者访问数组内容时就不会产生 同步成本(因为他们从来不是在易变数据上操作)。

本质上讲,CopyOnWriteArrayList 对处理 ArrayList 让我们失败这种场景是很理想的:读 取频繁,但很少有写操作的集合,例如 JavaBean 事件的 Listeners。

3. BlockingQueue

BlockingQueue 界面表示它是一个 Queue,意思是它的项以先入先出(FIFO)顺序存储。在 特定顺序插入的项以相同的顺序检索 — 但是需要附加保证,从空队列检索一个项的任何尝试 都会阻塞调用线程,直到这个项准备好被检索。同理,想要将一个项插入到满队列的尝试也会 导致阻塞调用线程,直到队列的存储空间可用。

BlockingQueue 干净利落地解决了如何将一个线程收集的项“传递”给另一线程用于处理的 问题,无需考虑同步问题。Java Tutorial 的 Guarded Blocks 试用版就是一个很好的例子。 它构建一个单插槽绑定的缓存,当新的项可用,而且插槽也准备好接受新的项时,使用手动同 步和 wait()/notifyAll() 在线程之间发信。

尽管 Guarded Blocks 教程中的代码有效,但是它耗时久,混乱,而且也并非完全直观。退 回到 Java 平台较早的时候,没错,Java 开发人员不得不纠缠于这种代码;但现在是 2010 年 — 情况难道没有改善?

关于java.util.concurrent您不知道的 5 件事,第1部分(2)

时间:2012-04-24 IBM Ted Neward

清单 1 显示了 Guarded Blocks 代码的重写版,其中我使用了一个 ArrayBlockingQueue, 而不是手写的 Drop。

清单 1. BlockingQueue

import java.util.*; import java.util.concurrent.*; class Producer    implements Runnable {    private BlockingQueue<String> 

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