问题描述
在网上搜到一篇线程死锁的博客,后来发现,两个线程并不会发生死锁。我的理由是Threadthread01=newThread(run01);Threadthread02=newThread(run02);这两个线程构造函数传进来的参数Runnable对象run01,run02,会分别创建obj1、obj2,也就说两个线程通过synchronized(obj1)和synchronized(obj2)并不能实现互斥。[/color]packagecn.thread;publicclassThreadDieSockimplementsRunnable{privateintflag=1;privateObjectobj1=newObject(),obj2=newObject();publicvoidrun(){System.out.println("flag="+flag);if(flag==1){synchronized(obj1){System.out.println("我已经锁定obj1,休息0.5秒后锁定obj2去!");try{Thread.sleep(500);}catch(InterruptedExceptione){e.printStackTrace();}synchronized(obj2){System.out.println("1");}}}if(flag==0){synchronized(obj2){System.out.println("我已经锁定obj2,休息0.5秒后锁定obj1去!");try{Thread.sleep(500);}catch(InterruptedExceptione){e.printStackTrace();}synchronized(obj1){System.out.println("0");}}}}publicstaticvoidmain(String[]args){ThreadDieSockrun01=newThreadDieSock();ThreadDieSockrun02=newThreadDieSock();run01.flag=1;run02.flag=0;Threadthread01=newThread(run01);Threadthread02=newThread(run02);System.out.println("线程开始喽!");thread01.start();thread02.start();}}
解决方案
解决方案二:
两个线程,两把锁就有可能会列锁,
解决方案三:
你执行的结果是什么!System.out.println("1");和System.out.println("0");打印出来了吗!
解决方案四:
那两个obj,搞成static就能模拟出来了。否则确实锁不上。爱学习的人遇上烂书。。。
解决方案五:
按楼主贴的代码来说,肯定死锁不了的!若楼主所看的博客的代码也确实如此,那估计是人家有可能是写漏了static了,这里的obj1和obj2若设为static,这个代码就能死锁!质疑并实践,学到的就是自己的,赞!
解决方案六:
我也不懂求解
解决方案七:
我只说一句:楼主说的没错第二:这个博客贴代码居然没有通过测试,误人子弟
解决方案八:
楼主正确~
解决方案九:
死锁发生,是占用共同资源,不释放,实例变量每一个对象都有一个锁,静态变量整个类对象只有一个共同锁,会发生死锁
解决方案十:
你这个代码当然不会死锁、锁住的都不是同一个对象。。
解决方案十一:
Synchronized是同一时刻只能有一个对象获得锁.....你new了两个run,run01,run02,这两个对象是完全不相干的也就是run01里面的obj和run02里面的obj根本就是两块内存....不相干的...只要new一个ThreadDieSock对象new两个Thread...把flag=-1->static....run方法加一句flag++;可以了吧