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