什么是死锁,如何在Java中进行分析并避免死锁?
Java中的死锁
当两个线程永远等待对方意味着(即没有机会进入就绪队列)时,这种无限等待类型称为死锁。
当等待进程仍保留第一个需要完成的另一个资源时,就会发生死锁。
通过使用synced关键字,我们可能会陷入僵局。不建议将Synchronize关键字不必要地应用。
我们无法解决僵局,但可以基于几种技术来避免出现僵局。
我们如何分析僵局情况?
如果所有线程只有一个对象,那么我们可以使用一个称为“等待图形”的图形。
如果一个线程有多个对象作为一个周期,那么等待图形将无法正常工作,那么我们应该在操作系统中寻求类似banker算法的解决方案来检测死锁。
在给定的示例中,下面我们将看到死锁的情况:
示例
class HelloClass{ public synchronized void first(HiClass hi) { try{ Thread.sleep(1000); } catch(InterruptedException ie){} System.out.println(" HelloClass is calling HiClass second() method"); hi.second(); } public synchronized void second(){ System.out.println("I am inside second method of HelloClass"); } } class HiClass{ public synchronized void first(HelloClass he) { try{ Thread.sleep(1000); } catch(InterruptedException ie){} System.out.println(" HiClass is calling HelloClass second() method"); he.second(); } public synchronized void second(){ System.out.println("I am inside second method of HiClass"); } } class DeadlockClass extends Thread{ HelloClass he = new HelloClass(); HiClass hi = new HiClass(); public void demo(){ this.start(); he.first(hi); } public void run(){ hi.first(he); } public static void main(String[] args){ DeadlockClass dc = new DeadlockClass(); dc.demo(); } }
输出结果
D:\Java Articles>java DeadlockClass HelloClass is calling HiClass second() method HiClass is calling HelloClass second() method