快速业务通道

Java理论与实践: 描绘线程安全性 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22
方式),那么没有一种对这个类的对象 的操作序列(读或者写公共字段以及调用公共方法)可以让对象处于无效状态,观 察到对象处于无效状态、或者违反类的任何不可变量、前置条件或者后置条件的 情况。

此外,一个类要成为线程安全的,在被多个线程访问时,不管运行时环境执 行这些线程有什么样的时序安排或者交错,它必须仍然有如上所述的正确行为, 并且在调用的代码中没有任何额外的同步。其效果就是,在所有线程看来,对于 线程安全对象的操作是以固定的、全局一致的顺序发生的。

正确性与线程安全性之间的关系非常类似于在描述 ACID(原子性、一致性、 独立性和持久性)事务时使用的一致性与独立性之间的关系:从特定线程的角度 看,由不同线程所执行的对象操作是先后(虽然顺序不定)而不是并行执行的。

方法之问的状态依赖

考虑下面的代码片段,它迭代一个 Vector 中的元素。尽管 Vector 的所有 方法都是同步的,但是在多线程的环境中不做额外的同步就使用这段代码仍然是 不安全的,因为如果另一个线程恰好在错误的时间里删除了一个元素,则 get() 会抛出一个 ArrayIndexOutOfBoundsException 。

Vector v = new Vector();    // contains race conditions -- may require external synchronization    for (int i=0; i<v.size(); i++) {     doSomething(v.get(i));    }

这里发生的事情是: get(index) 的规格说明里有一条前置条件要求 index 必须是非负的并且小于 size() 。但是,在多线程环境中,没有办法可以知道上 一次查到的 size() 值是否仍然有效,因而不能确定 i<size() ,除非在上 一次调用了 size() 后独占地锁定 Vector 。

更明确地说,这一问题是由 get() 的前置条件是以 size() 的结果来定义的 这一事实所带来的。只要看到这种必须使用一种方法的结果作为另一种讲法的输 入条件的样式,它就是一个 状态依赖,就必须保证至少在调用这两种方法期间 元素的状态没有改变。一般来说,做到这一点的唯一方法在调用第一个方法之前 是独占性地锁定对象,一直到调用了后一种方法以后。在上面的迭代 Vector 元 素的例子中,您需要在迭代过程中同步 Vector 对象。

线程安全程度

如上面的例子所示,线程安全性不是一个非真即假的命题。Vector 的方法都 是同步的,并且 Vector 明确地设计为在多线程环境中工作。但是它的线程安全 性是有限制的,即在某些方法之间有状态依赖(类似地,如果在迭代过程中 Vector 被其他线程修改,那么由 Vector.iterator() 返回的 iterator 会抛出 ConcurrentModificationException )。

对于 Java 类中常见的线程安全性级别,没有一种分类系统可被广泛接受, 不过重要的是在编写类时尽量记录下它们的线程安全行为。

Bloch 给出了描述五类线程安全性的分类方法:不可变、线程安全、有条件 线程安全、线程兼容和线程对立。只要明确地记录下线程安全特性,那么您是否 使用这种系统都没关系。这种系统有其局限性 -- 各类之间的界线不是百分之百 地明确,而且有些情况它没照顾到 -- 但是这套系统是一个很好的起点。这种分 类系统的核心是调用者是否可以或者必须用外部同步包围操作(或者一系列操作) 。下面几节分别描述了线程安全性的这五种类别。

不可变

本栏目的普通读者听到我赞美不可变性的优点时不会感到意外。不可变的对 象一定是线程安全的,并且永远也不需要额外的同步。因为一个不可变的对象只 要构建正确,其外部可见状态永远也不会改变,永远也不会看到它处于不一致的 状态。Java 类库中大多数基本数值类如 Integer 、 String 和 BigInteger 都 是不可变的。

Java理论与实践: 描绘线程安全性(3)

时间:2010-12-22 IBM Brian Goetz

线程安全

线程安全的对象具有在上

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