java.util.concurrent工具

ZDNet软件频道 时间:2004-03-10 作者:Builder.com |  我要评论()
本文关键词:javatips
synchronized是内嵌的关键字之一,java.lang.Object也已经有了wait, notify, 和 notifyAll方法。这些基本的工具考虑到了初级的线程控制。
本文译自Builder.com,未经许可请勿转载

线程是JAVA语言中的重要应用. 在版本1.0之前,java.lang.Thread类就存在了,synchronized是内嵌的关键字之一,java.lang.Object也已经有了wait, notify, 和 notifyAll方法。这些基本的工具考虑到了初级的线程控制。然而,在软件设计和开发期,会出现一些情况,在这些情况下使用基本的wait, notify和synchronized无法实现某些正确的多线程行为。

避免竞争条件(race condition)

面对严格的线程编写要求,开发者们有两种选择。他们可以谨慎地使用Java提供的工具实现要求的语义,或者,也可以选择大量的简化工作,他们只需要求其线程有90%的正确度,并且希望可以幸运的赢得竞争条件(race condition)。最后,许多开发者,通常是不知不觉的,采用了第二个选择。

六年前,Doug Lea在基本的Java同步工具(synchronization tools)之上,开始编写高质量、高效率、语义上准确的线程控制结构。而这个研究结果,亦即util.concurrent,能帮助那些惯于使用简单、宽松的方式的开发者实现严格精确的线程行为,而不需他们花费更多功夫。

util.concurrent类提供一部分基本接口的专门实现。Sync接口及其实现提供用于锁定(locking)的工具。锁定通常用于限制对资源的访问。而当多线程需要协同参与执行任务时,屏障(Barrier)类家族将发挥作用。有时,要求多个独立的任务必须在另一个任务开始前结束,这时,屏障(Barrier)类将显得极为有用。

Sync接口

配置Sync接口的对象至少要提供acquire() 和release() 两种方法。试图占有Sync接口的线程调用acquire()方法,然后等待,直到轮到它们(线程)掌控Sync接口。处理完毕后,占有Sync接口的线程必须调用sync上的release方法。Sync接口的行为与对象监控器(Object's monitor)极其相似。然而,尽管同步方法(synchronized methods)和块(blocks)被语义上区分无论在何处,Sync接口的取得和释放还是可以被执行的。

当多个线程同时在等待获取Sync接口时,线程占有权的最后次序取决于被选定的特定的Sync实现。Sync的时序安排选项(即特定的Sync实现)包括先到先服务(first come first served,FCFS)和基于线程优先级(thread priority based)。在所有的Sync实现上也可以使用attempt方法,它考虑了线程等待Sync的最大持续时间。


百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134