问题描述
publicclassTestDeadLockimplementsRunnable{publicintflag=1;staticObjecto1=newObject(),o2=newObject();publicvoidrun(){System.out.println("flag="+flag);if(flag==1){synchronized(o1){try{Thread.sleep(500);}catch(Exceptione){e.printStackTrace();}synchronized(o2){System.out.println("o2DeadLock");}}}if(flag==0){synchronized(o2){try{Thread.sleep(500);}catch(Exceptione){e.printStackTrace();}synchronized(o1){System.out.println("o2DeadLock");}}}}publicstaticvoidmain(String[]args){TestDeadLocktest1=newTestDeadLock();TestDeadLocktest2=newTestDeadLock();test1.flag=1;test2.flag=0;Threadt1=newThread(test1);Threadt2=newThread(test2);t1.start();t2.start();}}为什么程序会死锁啊TestDeadLocktest1=newTestDeadLock();TestDeadLocktest2=newTestDeadLock();这两个new出来在内存中的分布是不是这样的啊
解决方案
解决方案二:
你可以假设test1和test2这两个对象启动的线程中的任何一个先得到执行机会,这里假设是test2启动的线程因为test2的flag被置为0,进入if(flag==0)的那个同步块,获得o2的锁,然后睡眠500ms,这么长的时候test1启动的线程早就获得执行的机会了,进入对应的同步块获得o1的锁,然后睡眠500ms~~过了500ms醒来,一个需要o1的锁才能继续往下执行,一个需要o2的锁才能继续往下执行,但各自此时都无法释放相应的锁给对方,就互相等待着,进入死锁~~~test1启动的线程先执行的话做类似分析~~
解决方案三:
2.同步块,示例代码如下:publicvoidmethod(SomeObjectso){synchronized(so){//…..}}这时,锁就是so这个对象,谁拿到这个锁谁就能够运行他所控制的那段代码。当有一个明确的对象作为锁时,就能够这样写程式,但当没有明确的对象作为锁,只是想让一段代码同步时,能够创建一个特别的instance变量(他得是个对象)来充当锁:
解决方案四:
该回复于2011-04-18 08:53:17被版主删除
解决方案五:
死锁,是因为相互需要,而这时又相互的制约住了。
解决方案六:
又是马士兵的教程
解决方案七:
因为这个里的两个object都是static,所以test1.o1就是test2.o1;test1.o2就是test2.o2。