线程安全与共享资源-编程开发技术

线程安全与共享资源-编程开发技术

ID:31056703

大小:67.00 KB

页数:3页

时间:2019-01-06

线程安全与共享资源-编程开发技术_第1页
线程安全与共享资源-编程开发技术_第2页
线程安全与共享资源-编程开发技术_第3页
资源描述:

《线程安全与共享资源-编程开发技术》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

1、线程安全与共享资源-编程开发技术线程安全与共享资源译文出处:毕冉原文出处:JakobJenkov允许被多个线程同时执行的代码称作线程安全的代码。线程安全的代码不包含竞态条件。当多个线程同时更新共享资源时会引发竞态条件。因此,了解J3V3线程执行时共享了什么资源很重要。局部变量局部变量存储在线程自己的栈屮。也就是说,局部变量永远也不会被多个线程共享。所以,基础类型的局部变量是线程安全的。下面是基础类型的局部变量的一个例了:publicvoidsomeMethodO{longthreadSafelnt二0;thrcadSafcInt++;局部的对象引用对象的局部引用和基础类

2、型的局部变量不太一样。尽管引用木身没有被共享,但引用所指的对象并没冇存储在线程的栈内。所冇的对象都存在共享堆中。如果在某个方法中创建的对象不会逃逸出〈译者注:即该对彖不会被其它方法获得,也不会被非局部变量引用至叽该方法,那么它就是线程安全的。实际上,哪怕将这个对象作为参数传给其它方法,只要别的线程获取不到这个对象,那它仍是线程安全的。下面是一个线程安全的局部引用样例:publicvoidsomeMethodO{LocalObjectlocalObject=newLocalObject();localObject.callMethod();method2(localObj

3、ect);publicvoidmethod2(LocalObjectlocalObject){localObject.setValue(〃value〃);样例中LocalObject对象没冇被方法返回,也没冇被传递给someMethodO方法外的对象。毎个执彳亍someMethod()的线程都会创建口己的LocalObject对彖,并赋值给localObject引用。因此,这里的LocalObject是线程安全的。事实上,整个someMethod()都是线程安全的。即使将LocalObject作为参数传给同一个类的其它方法或其它类的方法时,它仍然是线程安全的。当然,如杲

4、LocalObject通过某些方法被传给了别的线程,那它就不再是线程安全的了。对象成员对象成员存储在堆上。如果两个线程同吋更新同一个对象的同一个成员,那这个代码就不是线程安全的。下面是一个样例:publicclassNotThreadSafc{StringBuilderbuilder=newStringBuilder();publicadd(Stringtext){this.bui1der.append(text);}如果两个线程同时调用同一个NotThreadSafe实例上的add()方法,就会有竞态条件问题。例如:NotThreadSafesharedTnstanc

5、e二newNotThreadSafe();newThread(newMyRunnable(sharedlnstance))・start();newThread(newN^Runnable(sharedlnstance)).start();publicclassMyRunnableimplementsRunnable{NotThreadSafeinstance二nul1;publicMyRunnable(NotThreadSafeinstanee){this・instance=instance;}publicvoidrun(){this・instance・add("som

6、etext");注意两个MyRunnable共享了同一个NotThreadSafe对象。因此,当它们调用add()方法时会造成竞态条件。当然,如果这两个线程在不同的NotThreadSafe实例上调用call()方法,就不会导致竞态条件。下面是稍微修改后的例了:newThread(newMyRunnable(newNotThreadSafe()))・start();newThread(newMyRunnable(newNotThreadSafe())).start();现在两个线程都有自己单独的NotThreadSafe对象,调用add()方法时就会互不干扰,再也不会有

7、竞态条件问题了。所以非线程安全的对象仍叮以通过某种方式来消除竞态条件。线程控制逃逸规则线程控制逃逸规则可以帮助你判断代码中对某些资源的访问是否是线程安全的。如果一个资源的创建,使用,销毁都在同一个线程内完成,且永远不会脱离该线程的控制,则该资源的使用就是线程安全的。资源可以是对彖,数组,文件,数据库连接,套接字等等。Java中你无需主动销毁对彖,所以“销毁”指不再冇引用指向对彖。即使对象本身线程安全,但如果该对彖中包含其他资源(文件,数据库连接),整个应用也许就不再是线程安全的了。比如2个线程都创建了各自的数据库连接,每个连接自身是线程安

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。