问题描述
publicclassDeadlock{staticclassFriend{privatefinalStringname;publicFriend(Stringname){this.name=name;}publicStringgetName(){returnthis.name;}publicsynchronizedvoidbow(Friendbower){System.out.format("%s:%s"+"hasbowedtome!%n",this.name,bower.getName());bower.bowBack(this);}publicsynchronizedvoidbowBack(Friendbower){System.out.format("%s:%s"+"hasbowedbacktome!%n",this.name,bower.getName());}}publicstaticvoidmain(String[]args){finalFriendalphonse=newFriend("Alphonse");finalFriendgaston=newFriend("Gaston");newThread(newRunnable(){publicvoidrun(){alphonse.bow(gaston);}}).start();newThread(newRunnable(){publicvoidrun(){gaston.bow(alphonse);}}).start();}}为什么会死锁呢?
解决方案
解决方案二:
很明显啊,两个线程调用同一个资源bowBack()造成的
解决方案三:
是比较特殊,用了两个同步就出这个问题了
解决方案四:
假设alphonse为A,alphonse为B在A的同步代码区想要调用B的方法,但是这个时候在B的同步代码区想要调用A的方法,所以就死锁了。。。
解决方案五:
两个线程互相锁了.
解决方案六:
你创建了两个对象(资源),两个线程。每一个线程都占有一个非共享资源的同时又去争取另外一个线程占有的非共享资源,刚好符合死锁死锁的最简单条件,成了一个闭环!这段程序想不死锁的方法太多了,就不说了。