当前位置:七道奇文章资讯编程技术Java编程
日期:2011-03-22 16:13:00  来源:本站整理

Java理论和实践: 安全构造技术[Java编程]

赞助商链接



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

Java 语言供应了机动的、看上去很简单的线程功效,使得您很简单在您的利用程序中利用多线程.但是,Java利用程序中的并发编程比看上去要复杂:在 Java 程序中,有一些奇妙(大概并非那么奇妙)方法会造成数据争用(data race)以及并发问题.在这篇 Java 理论和实践中,Brian探究了一个常见的线程方面的危险:在构造历程中,答应 this 引用逃脱(escape).这个看上去没有什么危害的做法可以在 Java 程序中造成无法可意料和不盼望的后果.

测试和调试多线程程序是极端艰难的,因为并发性方面的危险常常不是以一致的方法显现出来,乃至有时未必会显现这种危险性.就线程问题的本质而言,大大都这些问题是无法意料的,乃至在某些平台上(如单处理器系统),大概低于一定的负载,问题大概根本就不呈现.由于测试多线程程序的精确性是如此艰难,以及查找错误是如此费时,因此从一开始开辟利用程序就要在心中紧记线程的安全性,这一点就显得尤为重要.在本文中,我们将研究一个特别的线程安全方面的问题 ― 在构造历程中,答应 this 引用逃脱(我们称之为 逃脱的引用问题) ― 该问题惹起了一些未曾盼望的后果.然后,为了编写出线程安全的构造函数,我们给出一些原则.

遵守“安全构造”技术

解析程序来找出线程安全的违例是非常艰难的,这需求专门的经验.幸运的是(大概会感到吃惊),从一开始成立线程安全的类并非那样的艰难,固然这需求一种别的专门的本领:规程.大大都并发性错误是来自程序员以便利、改进性能或只是一时的怠惰为名计划违规而造成的.如很多别的并发性问题一样,在编写构造函数时,遵守一些简单的法则便可以避免这个逃脱的引用问题.

危险的争用状况

大大都并发性危险归根结底是由某类 数据争用惹起的.在多个线程或进程正在读取和写入一个同享数据项时,会发生数据争用或进入 争用状况 ,终究后果取决于这些线程的调度次序.清单 1 给出了一个简单的数据争用的示例,此中程序可以打印 0 大概 1,这取决于对线程的调度.

清单 1. 简单的数据争用

public class DataRace {
  static int a = 0;
  public static void main() {
   new MyThread().start();
   a = 1;
  }
  public static class MyThread extends Thread {
   public void run() {
   public void run() {
    System.out.println(a);
   }
  }
}

可以当即调度第二个线程,打印 a 的初始值 0.另一种情形,第二个线程大概 不当即运行,则招致打印值 1.这个程序的输出取决于您正在利用的 JDK、底层操作系统的调度程序大概随机计时构件.反复运行该程序,会得到差别的后果.

可见性危险

在清单 1 中,除了这个明显的争用 ― 第二个线程是在第一个线程将 a 置为 1 之前还是之后开始履行 ― 之外,实际上还有另一种数据争用.第二种争用是一种可见性方面的争用:两个线程没有利用同步,而同步能保证线程之间数据更改的可见性.因为没有同步,假如在第一个线程对 a 赋值完成之后,运行第二个线程,则第二个线程大概或 不大概当即瞥见第一个线程所做的更改.第二个线程大概看到 a 仍旧为 0,即便第一个线程已经将值 1 赋给了 a.这种第二类的数据争用(在没有精确同步的情形下,两个线程正在拜候同一变量)是一种复杂的问题,但幸运的是,每当读取一个别的线程大概已写过的变量,大概写一个接下来大概会被别的线程读取的变量时,利用同步便可以避免这类数据争用.在这里,我们不想进一步探究这类数据争用,关于这类复杂问题,您可以参阅侧栏 “用 Java Memory Model 同步”,也可以参阅 参考资料以获得更多有关这类复杂问题的具体信息.


  以上是“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 .