什么是死锁,如何在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