什么是死锁,举出一个死锁的Java代码示例
时间: 2024-09-13 09:12:23 浏览: 46
java线程死锁代码示例
死锁是指两个或多个进程在执行过程中,因争夺资源而又互相等待对方释放资源而造成的一种僵局状态。换句话说,每个进程都保持运行并阻塞在那里,等待另一个进程首先释放它所持有的资源。在这种情况下,没有任何进程能够继续执行下去,系统就进入了无法恢复的状态。
下面是一个简单的Java代码示例,展示了死锁的概念:
```java
public class DeadlockExample {
static class ResourceA {
private boolean locked;
public synchronized void lock() {
if (!locked) {
System.out.println(Thread.currentThread().getName() + " acquired resource A");
locked = true;
} else {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public synchronized void unlock() {
locked = false;
notifyAll(); // 如果B还没有锁A,这将唤醒B
}
}
static class ResourceB {
private boolean locked;
public synchronized void lock() {
if (!locked) {
System.out.println(Thread.currentThread().getName() + " acquired resource B");
locked = true;
} else {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public synchronized void unlock() {
locked = false;
notifyAll(); // 如果A还没有锁B,这将唤醒A
}
}
public static void main(String[] args) throws InterruptedException {
ResourceA a = new ResourceA();
ResourceB b = new ResourceB();
Thread t1 = new Thread(() -> {
a.lock();
try {
b.lock();
System.out.println("Thread 1 completed");
} finally {
b.unlock();
}
});
Thread t2 = new Thread(() -> {
b.lock();
try {
a.lock();
System.out.println("Thread 2 completed");
} finally {
a.unlock();
}
});
t1.start();
t2.start();
t1.join();
t2.join();
}
}
```
在这个例子中,两个线程分别试图先获得ResourceA再获得ResourceB,或者先获得ResourceB再获得ResourceA。结果是双方都会永远等待对方释放资源,导致死锁。为了避免死锁,程序应按照相同的顺序请求资源或者采用资源分配图等策略来管理资源获取。
阅读全文