当前位置:七道奇文章资讯编程技术Java编程
日期:2011-01-26 02:54:00  来源:本站整理

Java理论与实践: 描绘线程安全性[Java编程]

赞助商链接



  本文“Java理论与实践: 描绘线程安全性[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
定义线程安全

  明肯定义线程安全性出其不意地艰难,大大都定义看上去美满是自我循环.快速搜索一下 Google,可以找到以下关于线程安全代码的典型的、但是没有多大帮忙的定义(大概可以说是描写):

  ...可以从多个编程线程中调用,无需线程之间不必要的交互.

  ...可以同时被多个线程调用,不需求调用一方有任何操作.

  有这样的定义,就不奇特我们关于线程安全性会感到如此迷惑.这些定义比说“一个类在可以被多个线程安全调用时就是线程安全的”好不了多少,当然,它的意义就是如此,但是它不能帮忙我们辨别一个线程安全的类与一个线程不安全的类.安全的意义是什么呢?

  实际上,全部线程安全的定义都有某种程序的循环,因为它必须符合类的规格阐明 -- 这是对类的功效、其副作用、哪些状况是有效和无效的、不可变量、前置条件、后置条件等等的一种非正式的疏松描写(由规格阐明给出的对象状况约束只利用于外部可见的状况,即那些可以通过调用其大众办法和拜候其大众字段看到的状况,而不该用于其私有字段中表示的内部状况).

  线程安全性

  类要成为线程安全的,首先必须在单线程环境中有精确的行为.假如一个类实现精确(这是说它符合规格阐明的另一种方法),那么没有一种对这个类的对象的操作序列(读大概写大众字段以及调用大众办法)可以让对象处于无效状况,察看到对象处于无效状况、大概违反类的任何不可变量、前置条件大概后置条件的情形.

  此外,一个类要成为线程安全的,在被多个线程拜候时,不管运行时环境履行这些线程有什么样的时序安置大概交叉,它必须仍旧有如上所述的精确行为,并且在调用的代码中没有任何额外的同步.其效果就是,在全部线程看来,关于线程安全对象的操作是以固定的、全局一致的次序发生的.

  精确性与线程安全性之间的关系非常近似于在描写 ACID(原子性、一致性、独立性和长期性)事件时利用的一致性与独立性之间的关系:从特定线程的角度看,由差别线程所履行的对象操作是先后(固然次序不定)而不是并行履行的.

  办法之问的状况依靠

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

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

  这里发生的事情是: get(index) 的规格阐明里有一条前置条件要求 index 必须是非负的并且小于 size() .但是,在多线程环境中,没有办法可以知道上一次查到的 size() 值能否仍旧有效,因而不能肯定 i

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


  以上是“Java理论与实践: 描绘线程安全性[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

  • 利用Javascript实现网页水印(非图片水印)
  • Java开辟环境的搭建
  • Ubuntu java安装与配置
  • 办理Ubuntu 10.04 Firefox3.6 Java浏览器插件不工作的问
  • Ubuntu重装后Java环境的设置
  • Sun Java进入Ubuntu 10.10软件中央
  • Ubuntu 10.10配置Java开辟环境
  • 在Ubuntu 10.10中配置Java环境变量的办法
  • Ubuntu下Java环境的搭建
  • Ubuntu 10.04 下安装 Java, JRE
  • Ubuntu 10.04下的搭建SUN JAVA开辟环境
  • Ubuntu 12.04安装java7
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .