Java 集合框架的线程安全 周庆岳.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Java 集合框架的线程安全 周庆岳.doc

Java集合框架的线程安全 周庆岳 Java集合框架是由Java平台标准版1.2 (Java SE 1.2)引入的通用数据结构与算法框架。其灵活的面对对象设计受到了广大Java程序员的一致青睐,为Java平台的成熟奠定了坚实的基础。 一个集合(也称容器)是指将一组元素组合成一个单元的简单对象。集合用于存储、取回、操作和传递这些聚合的元素。集合框架是指一个统一的用来表示和操作集合的体系结构[Bloch,1999]。最简单的集合如数组、列表和队列等,集合框架最著名的例子如C++ 标准库(STL)。 线程安全不是一个全有或全无的问题,难以对其进行精确的定义。线程安全笼统地讲是指程序在多线程环境下运行时的正确性。Java集合框架的设计者Bloch Joshua在他著名的《Java高效编程》一书中对Java线程安全的等级做出了相对精确的定义[Bloch,2001]:非可变、线程安全、条件线程安全、线程兼容和线程不友好。 本文将结合上述Bloch关于线程安全等级的定义,对Java集合框架中的集合类进行线程安全性分析, 并指出各个集合类在现实的编程环境中需要注意的并发编程的陷阱;同时对集合框架中通用算法对线程安全性的影响进行分析。所涉及的集合类不仅包括Java SE 1.2引入的集合类,还包括旧集合类(Java SE 1.2前引入) (Java SE 5引入)。从而帮助Java程序员在进行并发编程时更加高效地利用Java集合框架。 Java线程安全的等级定义 根据Bloch的定义,将线程安全分为五个等级,下面将给出这五个等级的描述和部分示例。 1、非可变 如果一个类的所有实例对于调用它们的客户端对象总是恒定不变的,而无需外部同步,则称为非可变的。字符串类和整数类都是非可变的,但在集合框架中并没有提供直接的非可变类,而是通过对可变类进行封装而得到非可变类。 非可变集合不可修改,因而它可以在各个线程间安全共享而无需额外的同步。作为一个好的实践准则,一旦生成非可变类之后,不要再持有被其封装的集合类的引用,这样才可以完全保证其非可变性。 2、线程安全 类的实例是可变的,但它的所有方法已经通过使用足够的内部同步使其实例可以被并发的使用而无需外部同步。并发的调用将会以某种全局一致的方式连续地执行。随机类和 定时器类都是线程安全类。集合框架中线程安全的类并发哈希映射类在Java SE 5 中被引入,它并不包含在原来的集合框架中,但它实现了集合框架Map接口。并发哈希映射类实现了并发和效率之间的高效平衡,已被作为哈希表类和同步映射表封装在并发环境下的高效替代品。 3、条件线程安全 除了某些方法需要在没有其它线程的干扰的情况下顺次执行之外,条件线程安全类和线程安全类类似。为了消除线程干扰的可能性,客户端对象在调用这类方法的过程中需要获得该集合类对象的锁来进行同步。一些旧集合类如Vector和Hashtable都是条件线程安全类,对这些集合类进行遍历操作时需要对其进行外部同步。 4、线程兼容 对其对象实例的所有方法调用都通过外部同步之后再进行,线程兼容类可以安全的并发使用。 集合框架中的通用目的集合的标准实现,如数组链表类和哈希映射表类等都是线程兼容的类。对线程安全的集合类进行遍历操作,需要先获得一个对它的条件线程类封装,然后再通过外部同步来进行遍历。 5、线程不友好 线程不友好类无法在多线程环境下安全地并发使用,即使对其所有的方法调用都进行外部同步。Java语言中只有很少几个类的方法是线程敌对的,已经被声明为不赞成使用。 Java集合框架抽象接口及其实现的线程安全 Java集合框架包括三个部分[Bloch,1999]:接口、实现和算法。 接口是抽象数据类型的表示集合,接口使得集合的操作和集合的具体实现细节相独立。在面对对象的语言里,这些接口一般形成一个层次结构。 实现是指表示这些集合接口的具体实现,实质上是可重用的数据结构,即通用集合类。 算法是指可以对实现集合接口的类进行一些实用计算的方法,比如排序和查找。这些算法可以说是多态的,同一个方法可以用于实现了适当接口的不同实现类。这些算法实质上是可重用的功能。 Java集合框架的接口层次和通用实现如下: 图1 Java集合框架的接口层次 接口 通用实现 集合 哈希集合、树集合和链接哈希集合 列表 数组链表和链接链表 队列 优先级队列 映射表 哈希映射表、树映射表和链接哈希映射表 表1 Java接口的通用实现 下面按接口分类对集合类进行线程安全分析。分析的对象主要包括表1中的通用实现类,还包括一些特殊用途的实现类。 1、集合接口 集合是不包含重复元素的抽象集合。实现该接口的集合类包括三个通用实现类哈希集合类、树集合类和链接哈希集合类,两个特殊用途实现类枚举集合类和写复制数组集合类。 三个

您可能关注的文档

文档评论(0)

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

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

1亿VIP精品文档

相关文档