Java多线程理解:死锁问题实例
死锁是多线程编程中的一种严重问题,它发生在两个或更多线程相互等待对方释放资源,从而形成的一种僵局。
以下是一个简单的Java多线程死锁问题实例:
// 线程1需要资源A和B
public class ResourceA {
private Object resource = new Object();
public synchronized void acquire() throws InterruptedException {
while (resource != null) {
await();
}
resource = new Object(); // 资源被占用
}
public synchronized void release() {
resource = null; // 资源被释放
notifyAll(); // 通知等待的线程
}
}
public class ResourceB {
private Object resource = new Object();
public synchronized void acquire() throws InterruptedException {
while (resource != null) {
await();
}
resource = new Object(); // 资源被占用
}
public synchronized void release() {
resource = null; // 资源被释放
notifyAll(); // 通知等待的线程
}
}
public class DeadlockExample implements Runnable {
private ResourceA resourceA;
private ResourceB resourceB;
public DeadlockExample(ResourceA resourceA, ResourceB resourceB) {
this.resourceA = resourceA;
this.resourceB = resourceB;
}
@Override
public void run() {
try {
// 线程1获取资源A
resourceA.acquire();
// 线程2获取资源B
resourceB.acquire();
// 死锁形成,两个线程无法同时执行
System.out.println("Deadlock detected");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
// 释放资源
resourceA.release();
resourceB.release();
}
}
}
public class Main {
public static void main(String[] args) {
ResourceA resourceA = new ResourceA();
ResourceB resourceB = new ResourceB();
Thread thread1 = new Thread(new DeadlockExample(resourceA, resourceB)), "Thread 1");
Thread thread2 = new Thread(new DeadlockExample(resourceA, resourceB))), "Thread 2");
thread1.start();
thread2.start();
}
}
在这个例子中,线程1需要资源A和B(分别对应ResourceA和ResourceB),而线程2同样需要这两个资源。由于两个线程都持有某个资源,它们都无法释放自己的资源去获取另一个资源,从而形成了死锁。
还没有评论,来说两句吧...