Java面试题之多线程 死锁与饥饿的区别?
在Java多线程编程中,死锁和饥饿是两种常见的问题,它们虽然都与线程的执行有关,但有着本质的区别。
定义:死锁是指两个或多个线程在执行过程中,因为争夺资源而造成的一种互相等待的状态。此时,所有线程都在等待对方释放资源,导致程序无法继续执行。
特征:
示例:
class A {
synchronized void methodA(B b) {
System.out.println("Thread 1: Holding A...");
try { Thread.sleep(100); } catch (InterruptedException e) {}
System.out.println("Thread 1: Waiting for B...");
b.last();
}
}
class B {
synchronized void last() {
System.out.println("Thread 2: Holding B...");
try { Thread.sleep(100); } catch (InterruptedException e) {}
System.out.println("Thread 2: Waiting for A...");
}
}
在这个例子中,线程1持有A并等待B,而线程2持有B并等待A,导致死锁。
定义:饥饿是指某个线程由于资源分配策略的原因,长时间得不到所需的资源,导致无法执行。饥饿通常是由于优先级调度不当或资源分配不均造成的。
特征:
示例:
class HighPriorityThread extends Thread {
public void run() {
while (true) {
// 执行某些高优先级的任务
}
}
}
class LowPriorityThread extends Thread {
public void run() {
while (true) {
// 执行某些低优先级的任务
}
}
}
在这个例子中,如果高优先级线程一直在运行,低优先级线程可能会长时间得不到执行机会,从而导致饥饿。
理解这两者的区别对于编写高效且健壮的多线程程序至关重要。