java死锁与活锁以及饥饿案例
时间: 2023-03-24 22:01:25 浏览: 173
Java中的死锁和活锁是多线程并发编程中的常见问题,这些问题可能会导致线程无法向前执行或陷入死循环。下面分别介绍Java中死锁和活锁的概念和案例。
1. 死锁
死锁是指两个或多个线程相互等待对方释放锁,从而导致所有线程都无法向前执行的状态。简单来说,当两个或多个线程都占有某些资源并且又想要获取对方占有的资源时,就会发生死锁。
下面是一个Java中的死锁例子:
```java
public class DeadlockExample {
private Object lock1 = new Object();
private Object lock2 = new Object();
public void method1() {
synchronized (lock1) {
System.out.println("Method 1: Holding lock 1...");
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lock2) {
System.out.println("Method 1: Holding lock 1 and lock 2...");
}
}
}
public void method2() {
synchronized (lock2) {
System.out.println("Method 2: Holding lock 2...");
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lock1) {
System.out.println("Method 2: Holding lock 1 and lock 2...");
}
}
}
public static void main(String[] args) {
DeadlockExample example = new DeadlockExample();
Thread t1 = new Thread(() -> example.method1());
Thread t2 = new Thread(() -> example.method2());
t1.start();
t2.start();
}
}
```
在这个例子中,两个线程t1和t2分别调用了method1和method2方法,这两个方法都需要获取lock1和lock2两个锁才能继续执行。由于t1占用了lock1并等待lock2,而t2占用了lock2并等待lock1,因此两个线程都无法释放自己占用的锁,从而陷入死锁状态。
2. 活锁
活锁是指线程们都在运行并尝试执行任务,但是由于某些条件始终无法满足,导致线程们一直在重试,但是最终无法完成任务。这种情况下,线程们看起来像是在不断地活动,但是实际上却没有任何进展。
下面是一个Java中的活锁例子:
```java
public class LiveLockExample {
private boolean isPolite;
public LiveLockExample(boolean isPolite) {
this.isPolite = isPolite;
}
public void bow(LiveLockExample partner) {
while (true) {
if (isPolite) {
System.out.println("I'm polite, I'll bow first");
partner.bowBack(this);
isPolite = false;
break;
阅读全文
相关推荐





