java死锁
时间: 2025-04-27 11:34:37 浏览: 19
死锁是指两个或以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。在Java程序中,当线程需要同步访问共享资源时就可能发生死锁。
以下是导致死锁的四个必要条件:
1. **互斥条件**:一个资源每次只能被一个线程使用;
2. **请求与保持条件**:一个已经持有一个资源的线程可以申请新的资源,在获得之前不会释放已有的资源;
3. **不可剥夺条件**:已经被分配给某一线程的资源不能再强行收回;
4. **循环等待条件**:若干个线程形成了首尾相接的一个环形链路,每个线程都在等待下一个线程所占有的资源;
为了演示如何发生死锁的情况,我们来看一个小例子:
```java
public class DeadlockExample {
private final Object lockA = new Object();
private final Object lockB = new Object();
public void methodOne() {
synchronized (lockA) {
// 模拟一些操作...
try { Thread.sleep(50); } catch (InterruptedException e) {}
synchronized (lockB) {
System.out.println("method one");
}
}
}
public void methodTwo() {
synchronized (lockB) {
// 模拟一些操作...
try { Thread.sleep(50); } catch (InterruptedException e) {}
synchronized (lockA) {
System.out.println("method two");
}
}
}
public static void main(String[] args) throws InterruptedException{
DeadlockExample demo = new DeadlockExample();
Runnable r1 = () -> demo.methodOne();
Runnable r2 = () -> demo.methodTwo();
Thread thread1 = new Thread(r1);
Thread thread2 = new Thread(r2);
thread1.start();
thread2.start();
thread1.join();
thread2.join();
}
}
```
上述代码中`methodOne()` 和 `methodTwo()` 都会尝试获取对`lockA`和`lockB`这两个对象监视器的所有权。如果运气不好,可能导致其中一个方法先拿到了`lockA`, 另一个则拿到`lockB`. 这样就会形成相互之间的依赖, 最终进入一种僵局状态 - 死锁.
解决这个问题的办法有很多, 例如尽量减少锁的数量、按一定的顺序加锁等措施都可以有效地预防死锁的发生。
阅读全文
相关推荐


















