下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、线程安全与共享资源-编程开发技术线程安全与共享资源译文出处:毕冉 原文出处:jakobjenkov允许被多个线程同时执行的代码称作线程安全的代码。线程安全的代码不包含竞 态条件。当多个线程同时更新共享资源时会引发竞态条件。因此,了解j3v3线 程执行时共享了什么资源很重要。局部变量局部变量存储在线程自己的栈屮。也就是说,局部变量永远也不会被多个线程共 享。所以,基础类型的局部变量是线程安全的。下面是基础类型的局部变量的一 个例了:public void somemethodo long threadsafelnt 二 0;thrcadsafcint+;局部的对象引用对象的局部引用和基础类型的局
2、部变量不太一样。尽管引用木身没有被共享,但 引用所指的对象并没冇存储在线程的栈内。所冇的对象都存在共享堆中。如果在 某个方法中创建的对象不会逃逸出译者注:即该对彖不会被其它方法获得,也 不会被非局部变量引用至叽该方法,那么它就是线程安全的。实际上,哪怕将这 个对象作为参数传给其它方法,只要别的线程获取不到这个对象,那它仍是线程 安全的。下面是一个线程安全的局部引用样例:publ ic void somemethodo localobject localobject = new localobject ();localobject. callmethod();method2(localobjec
3、t);public void method2(localobject localobject) localobject. setvalue(value);样例中localobject对象没冇被方法返回,也没冇被传递给somemethodo方法 外的对象。毎个执彳亍somemethod ()的线程都会创建口己的localobject对彖, 并赋值给localobject引用。因此,这里的localobject是线程安全的。事实上, 整个somemethod ()都是线程安全的。即使将localobject作为参数传给同一个 类的其它方法或其它类的方法时,它仍然是线程安全的。当然,如杲localo
4、bject 通过某些方法被传给了别的线程,那它就不再是线程安全的了。对象成员对象成员存储在堆上。如果两个线程同吋更新同一个对象的同一个成员,那这个 代码就不是线程安全的。下面是一个样例:public class notthreadsafcstringbuilder builder = new stringbuilder();public add(string text) thi s.bui1der. append(text);如果两个线程同时调用同一个notthreadsafe实例上的add ()方法,就会有竞态 条件问题。例如:notthreadsafe sharedtnstance 二 n
5、ew notthreadsafe();new thread(new myrunnable(sharedlnstance)start();new thread(new nrunnable(sharedlnstance). start();public class myrunnable implements runnablenotthreadsafe i nstance 二 nul1;public myrunnable(notthreadsafe instanee)thisinstance = instance;public void run() this instance add("s
6、ome text");注意两个myrunnabl e共享了同一个notthreadsafe对象。因此,当它们调用add () 方法时会造成竞态条件。当然,如果这两个线程在不同的notthreadsafe实例上调用call ()方法,就不 会导致竞态条件。下面是稍微修改后的例了:new thread(new myrunnable(new notthreadsafe()start(); new thread(new myrunnable(new notthreadsafe(). start();现在两个线程都有自己单独的notthreadsafe对象,调用add ()方法时就会互不 干扰
7、,再也不会有竞态条件问题了。所以非线程安全的对象仍叮以通过某种方式 来消除竞态条件。线程控制逃逸规则线程控制逃逸规则可以帮助你判断代码中对某些资源的访问是否是线程安全的。如果一个资源的创建,使用,销毁都在同一个线程内完成,且永远不会脱离该线程的控制,则该资源的使用就是线程安全的。资源可以是对彖,数组,文件,数据库连接,套接字等等。java中你无需主动 销毁对彖,所以“销毁”指不再冇引用指向对彖。即使对象本身线程安全,但如果该对彖中包含其他资源(文件,数据库连接), 整个应用也许就不再是线程安全的了。比如2个线程都创建了各自的数据库连 接,每个连接自身是线程安全的,但它们所连接到的同一个数据库也许不是线程 安全的。比如,2个线程执行如卜代码:检查记录x是否存在,如果不存在,插入x如果两个线程同吋执行,而且碰巧检查的是同一个记录,那么两个线程最终可能 都插入了记录:线
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度篮球运动员个人荣誉奖励合同3篇
- 公益性岗位劳动合同协议书(2025年度)-社区健康促进3篇
- 2025年度新能源汽车合伙人股权分配与产业链整合合同3篇
- 2025年度农村宅基地房屋租赁与乡村旅游资源开发合同2篇
- 2025年农村自建房安全责任追究协议书
- 二零二五年度智能机器人研发项目采购合同风险管理与防范3篇
- 2025年度智能制造企业监事聘用合同规范文本3篇
- 二零二五石材品牌授权与市场营销合作合同3篇
- 二零二五年度日本语言学校入学合同2篇
- 二零二五年度公司与公司签订的智慧社区建设合作协议3篇
- T-CECS120-2021套接紧定式钢导管施工及验收规程
- 2025年高考化学二、三轮复习策略讲座
- 2022年高考数学试卷(上海)(秋考)(空白卷)
- 山东省济南市语文小升初2024年模拟试题与参考答案
- 装配式建筑复习试题及答案
- 空气动力学仿真技术:湍流模型:k-ε湍流模型原理与应用
- 高中期末考试考风考纪及诚信教育
- 2025届广东省深圳市深圳外国语九年级物理第一学期期末经典试题含解析
- 机械工程技术训练智慧树知到期末考试答案章节答案2024年北京航空航天大学
- 医生与患者关系中的信任与治疗
- 心衰患者的容量管理中国专家共识-共识解读
评论
0/150
提交评论