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并发中的线程安全性   摘要:Java语言在并发程序方面的广泛应用对程序员提出了新的挑战,为了在多线程环境中开发出正确的程序,必须考虑线程安全性。本文结合一个Java程序阐明了这一概念,并介绍了在线程安全性上的一个安全等级,最后总结出设计线程安全类的几个有用原则。   关键词:Java;并发程序设计;多线程;线程安全性;同步   中图分类号:TP393文献标识码:A文章编号:1009-3044(2008)11-20338-03      1 引言      JAVA并发控制问题一直是国外学者研究的热点,特别是中级并发包java.util.concurrent伴随J2SE-1.5发布后,进一步引发人们对Java并发程序设计的研究。现在并发这一概念不仅是专家级的话题,且每个Java开发者都应该对它有所了解。文章首先对一个非线程安全的实例进行分析,在前人的基础上创造性地把数据库中的一些并发理论应用于线程安全性的分析,并解释了Java并发中的线程安全性概念,然后介绍了Bloch线程安全性等级,以它为标准对线程安全性进行划分,最后总结设计使用线程安全类应注意的问题,对研究Java并发中的线程安全性有一定的借鉴意义。      2 线程安全性分析      2.1 一个简单例子   线程安全性(thread safety)没有一个标准的定义,一般认为,可以被多个线程使用而不危及安全性的类称为线程安全(thread-safe)的类。该定义并不能帮助我们深刻理解线程安全性,下面来看一个非线程安全性的例子:   class UnsafeUniqueInteger {   private long value=0;   public long getNext() { /* 返回一个唯一的整数值。*/   value++;   try {//模仿实际工作中花时间   Thread.sleep((long)(Math.random()*100));   } catch (InterruptedException e){}   return value;   }   }   类UnsafeUniqueInteger的getNext方法旨在返回一个从1到n的唯一整数序列。显然,在单线程环境中该类能正确的运行,下面我们在多线程中对其进行测试:   public class Test {   public static void main(String[] args){   final UnsafeUniqueInteger u = new UnsafeUniqueInteger();   new Thread(A=){//线程A   public void run(){   long i=u.getNext();   while(i = 20){   try {   Thread.sleep((long)(Math.random()*100));   } catch (InterruptedException e) {}   String s = Thread.currentThread().getName();   System.out.print(s+i+ \t);   i=u.getNext(); }// public void run()   }   }.start();   new Thread(B=){//线程B   public void run(){/*与线程A中的run方法体相同*/ }}.start();   }// main()   }//class Test   为了模仿程序的实际运行,在UnsafeUniqueInteger类和Test类中均加入让程序睡眠0~0.1秒的语句Thread.sleep((long)(Math.random()*100)),以使非线程安全类的问题更容易暴露出来。若不在UnsafeUniqueInteger类中加入该语句,运行结果可能是正确的,这也说明调试多线程程序是很困难的,需要一定的技巧和经验。图1是运行结果:      从图中我们可以清楚地看到UnsafeUniqueInteger类产生唯一整数序列的目的并没有达到。甚至A线程和B线程都是从2开始打印输出,可见使用非线程安全的类将构造出错误的程序。   2.2 深入分析   UnsafeUniqueInteger类的问题是由于某种不幸的运行时调度:A和B两个线程可能同时调用getNext方法并得到同一个值。图2所示的调度顺序可作为图1结果的一种解释。      在UnsafeUniqueInteger类中,虽然字段value是私有(private

文档评论(0)

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

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

版权声明书
用户编号:5243141323000000

1亿VIP精品文档

相关文档