




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、java死锁范例以及如何分析死锁-编程 开发技术java死锁范例以及如何分析死锁木文由importnew范琦琦翻译自journaldevo欢迎加入翻译小组。转载请见文末要求。死锁是两个甚至多个线程被永久阻塞时的一种运行局面,这种局面的生成伴随着 至少两个线程和两个或者多个资源。在这里我已写好一个简单的程序,它将会引 起死锁方案然后我们就会明白如何分析它。java死锁范例threaddeadlock. javapackage com. journaldcv. threads;public class threaddeadlock public static void main(string ar
2、gs) throws tnterruptedexceptionobject objlobject obj2object obj3new object (); new object (); new object ();thread tl二newthread(newsyncthrcad(objl,obj2),tl);thread t2=newthread(newsyncthread (obj2,obj3),"t2");thread t3=newthread (newsyncthread (obj3,objl),"t3");tl. st art (); thr
3、ead, sleep(5000);t2. start ();thread, sleep(5000); t3. start ();class syncthread implernents runnable private object objl;private object obj2;public syncthread(object ol, object o2) this. objl=ol;this obj2=o2;©overridepublic void nan() st ring name = thread. currentthread (). getnameo ;system.o
4、ut. println(nanie + acquiring lock on +objl); synchronized (objl) system. out. println(name + " acquired lock on +objl); work ();system, out. println(name + acquiring lock on +obj2); synchronized (obj2) system, out. printin(name + acquired lock on +obj2); work ();system, out. println(namc + &qu
5、ot; released lock on +obj2);system.out. println(nanie + released lock on +objl); system, out. pr in tin (name + finished execution. /z); private void work() try thread, sleep(30000); catch 仃nterruptedexcept ion e) e. printstacktrace ();在上面的程序中同步线程正完成runnable的接口,它工作的是两个对象,这两 个对象向对方寻求死锁而且都在使用同步阻塞。在主函数
6、中,我使用了三个为同步线程运行的线程,而且在其中每个线程中都有 一个可共享的资源。这些线程以向笫一个对彖获取封锁这种方式运行。但是当它试着像第二个对彖获 取封锁吋,它就会进入等待状态,因为它已经被另一个线程封锁住了。这样,在 线程引起死锁的过程中,就形成了一个依赖于资源的循环。当我执行上而的程序时,就产生了输出,但是程序却因为死锁无法停止。tl acquiring lock on java.lang.0bject6d9dd520tl acquired lock on java.lang. 0bject6d9dd520t2 acquiring lock on java. lang. 0bject
7、22aed3a5t2 acquired lock on java, lang. object223ed3a5t3 acquiring lock on java.lang.0bject218c2661t3 acquired lock on java. lang. 0bject218c266111 acquiring lock on java.lang. 0bject22aed3a5t2 acquiring lock on java, lang. object218c2661t3 acquiring lock on java. lang. object6d9dd520在此我们可以清楚地在输岀结果屮
8、辨认岀死锁局面,但是在我们实际生活所用的 应用中,发现死锁并将它排除是非常难的。分析死锁为了分析一个死锁,我们需要关注下应用中的java线程转存,在上一节中我已 经解释了如何使用visualvm收集资料或者jstack应用程序产生线程转存。以下就是上述程序的线程转存。2012-12-27 19:08:34full thread dump java hotspot (tm) 64bit server vm (23. 5b02 mixed mode):"attach listener'7 dacmon prio=5 tid=0x00007fb0a2814000 nid=0x400
9、7 waiting on condition 0x0000000000000000java. lang. thread. state: runnable"destroyjaveivm" prio=5 tid=0x00007fb0a2801000 nid二0x1703 waiting on condition 0x0000000000000000java.lang.thread. state: runnablet3 prio=5 tid=0x00007fb0a204b000 nid=0x4d07 waiting for monitor entry 0x000000015d97
10、1000java.lang. thread .state: blocked (on object monitor)at com. journaldev. threads syncthread run(threaddeadlock java:41)-waiting to lock <0x000000013df2f658> (a java.lang.object)- locked <0x000000013df2f678> (a java. lang. object)at java. lang. thread, run (thread. java:722)t2 prio=5
11、tid=0x00007fb0a 1073000 nid=0x4207 waiting for monitor entry 0x000000015d209000java.lang. thread. state: blocked (on object monitor)at com. journal dev. threads. syncthread. run(threaddeadlock. java:41)- waiting to lock <0x000000013df2f678> (a java. lang. object)- locked <0x000000013df2f668
12、> (a java. lang. object)at java. lang. thread, run (thread.java:722)tl prio=5 tid=0x00007fb0a 1072000 nid=0x5503 waiting for monitor entry 0x000000015d86e000java.lang. thread. state: blocked (on object monitor)at com. journal dev. threads. syncthread. run(threaddeadlock. java:41)- waiting to lock
13、 <0x000000013df2f668> (a java. lang. object)- locked <0x000000013df2f658> (a java. lang. object) at java. lang. thread, run (thread.java:722)"service thread" daemon prio=5 tid=0x00007fboa1038000 nid二0x5303 runnable 0x0000000000000000java.lang. thread. state: runnable"c2 co
14、mpi 1 erthread 1daemon prio=5 tid=0x00007fb0al037000 nid=0x5203 waiting on condition 0x0000000000000000java. lang. thread. state: runnable"c2 compi 1 erthread0,z daemon prio=5 tid=0x00007fb0a 1016000 nid=0x5103 waiting on condition 0x0000000000000000java. lang. thread. state: runnable"sign
15、al dispatcher'7 dacmon prio=5 tid=0x00007fb0a4003000 nid=0x5003 runnable 0x0000000000000000java. lang. thread. state: runnable"finalizer" daemon prio=5 tid=0x00007fb0a4800000 nid=0x3f03 in object, wait () 0x000000015d0c0000java.1ang.thread.state: waiting (on object monitor)at java. lan
16、g. object, wait(native method)- waiting on <0x000000013de75798> (a java. lang. ref. referencequeue$lock)at java lerng. ref.refercnccqueuc. remove(refercnccqueuc. java:135) -locked <0x000000013de75798> (a java. lang. ref. referencequeue$lock) at java. lang. ref. referencequeue. remove(ref
17、erencequeue.java:151) atjava. lang. ref. finalizer$finalizerthread. run(finalizer. java:177)"reference handler" daemon prio=5 tid=0x00007fb0a4002000 nid=0x3e03 in object, wait() 0x000000015cfbd000java, lang. thread.state: waiting (on object monitor)at java. lang. object, wai t (native meth
18、od)-waiting on <0x000000013dc75320> (a java. lang. ref. rcfcrcncc$lock) at java lang.0bject.wait(object java:503)atjava.lang.ref. reference$referencehandler. run(referenee. java:133)- locked <0x000000013de75320> (a java. lang. ref. reference$lock)vm thread" prio=5 tid=0x00007fb0a204
19、9800 nid二0x3d03 runnable"gc task thrcadso (parallclgc)z,prio=5 tid=0x00007fb0a300d800 nid=0x3503 runnablegc task thread# 1 (parallelgc)prio=5 tid=0x00007fb0a2001800 nid二0x3603runnablegc task thread#2 (parallelgc)z,prio=5 tid=0x00007fb0a2003800 nid二0x3703 runnablegc task thread#3 (parallelgc)
20、9; prio=5 tid=0x00007fb0a2004000 nid二0x3803 runnablegc task thread#4 (parallelgc)z,prio=5 tid=0x00007fb0a2005000 nid二0x3903 runnablegc task thread#5 (paral 1 elgc)' prio=5 tid=0x00007fb0a2005800 nid=0x3a03 nmn ablegc task thread#6 (parallelgc)z,prio=5 tid=0x00007fb0a2006000 nid=0x3b03 runnable&q
21、uot;gc task thrcad#7 (parallclgc)z,prio=5 tid=0x00007fb0a2006800 nid=0x3c03runnablevm periodic task thread" prio=5 tid=0x00007fboa1015000 nid二0x5403waiting on conditionjn1 global references: 114found one java-level deadlock:气3:waiting to lock monitor 0x00007fb0al074b08 (object 0x000000013df2f65
22、8, a java. lang. object),which is held by tltl: waiting to lock monitor 0x00007fb0al010f08 (object 0x000000013df2f668,a java lang. 0bject),which is held by "t2气2:waiting to lock monitor 0x00007fb0al012360 (object 0x000000013df2f678, a java. lang. object),which is held by t3java stack informatio
23、n for the threads listed above:at com. journaldev. threads. syncthread. run(threaddeadlock. java:41)- waiting to lock <0x000000013df2f658> (a java.lang. object)- locked <0x000000013df2f678> (a java.lang. object)at java lang .thread run( thread java:722)tl:at com. journaldev. threads. syn
24、cthread. run(threaddeadlock. java:41)- waiting to lock <0x000000013df2f668> (a java. lang. object)- locked <0x000000013df2f658> (a java. lang. object)at java lang. thread nin(thread java:722)气2:at com. journaldev. threads. syncthread. run(threaddeadlock. java:41)- waiting to lock <0x0
25、00000013df2f678> (a java. lang. object)- locked <0x000000013df2f668> (a java. lang. object) at java lang. thread nin(thread java:722)found 1 deadlock.这三个线程转存的输岀清处地说明了死锁环境和线程,以及包含死锁环境的资 源。为了分析死锁,我们需要关注死锁状态的线程,然后资源再等待去封锁,每一个 资源都冇一个独特的1d,冇了这个1d我们就能发现是哪一个进程已经封锁住对 彖。举个例子,线程 气3”正在等待封锁0x000000013df2f658,但是它己经被线 程气1”封锁住了。当我们分析死锁环境的时候,如果发现线程正在引起死锁,这是我们就要改变代 码來避免死锁的产生。避免死锁有很多方针可供我们使用来避免死锁的局面。避免嵌套封锁:这是死锁最主要的原因的,如果你已经有一个资源了就要避免封锁 另一个资源。如果你运行时只有一个对象封锁,那是儿乎不可能出现
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 45223-2025电力厂站低压用电系统信息架构及接口技术规范
- 合肥小型商铺出租合同样本
- 公司并购合同管理与风险防范
- 心理康复师实习劳动合同
- 设计师合作开发合同模板专业版
- 标准版劳动合同范本合同
- 国际仓储业务合作合同范本
- 度中国员工境外工作劳务合同
- 供应链合作协议合同法全文
- 中小学教师职务合同范本
- 部编版语文八年级下册第六单元名著导读《钢铁是怎样炼成的》问答题 (含答案)
- 小学数学计算能力大赛实施方案
- 古诗词诵读《虞美人》课件-统编版高中语文必修上册
- 文物学概论-中国古代青铜器(上)
- 制作拉线课件
- 中华人民共和国文物保护单位登记表
- 不符合项和纠正措施记录表
- DBJ∕T13-354-2021 既有房屋结构安全隐患排查技术标准
- 温室大棚、花卉苗圃采暖方案(空气源热泵)
- 部编人教版五年级下册道德与法治全册知识点整理归纳
- 绘本阅读《铁丝网上的小花》
评论
0/150
提交评论