Java多线程并发问题:死锁、饥饿等现象的示例
在Java多线程环境中,死锁、饥饿等问题可能会出现。以下是两个示例:
死锁示例:
```java
// 定义两个线程,分别拥有资源A和B
class ThreadA implements Runnable {
private int resourceA;ThreadA(int resourceA) {
this.resourceA = resourceA;
}
@Override
public void run() {System.out.println("Thread A: Acquiring Resource A (" + resourceA + ") ...");
// 线程A获得资源A后,尝试获取资源B
if (resourceA > 0) {
resourceA--;
System.out.println("Thread A: Acquiring Resource B (" + resourceB + ") ...");
// 线程B需要资源A才能继续执行,但资源A已经被线程A占用
// 这就形成了死锁,两个线程都无法继续执行
} else {
System.out.println("Thread A: Unable to acquire Resource A. Exiting.");
}
}
}
class ThreadB implements Runnable {
private int resourceB;
ThreadB(int resourceB) {
this.resourceB = resourceB;
}
@Override
public void run() {
System.out.println("Thread B: Acquiring Resource B (" + resourceB + ") ...");
// 线程B获得资源B后,尝试获取资源A
if (resourceB > 0) {
resourceB--;
System.out.println("Thread B: Acquiring Resource A (" + resourceA + ") ...");
// 线程A需要资源B才能继续执行,但资源B已经被线程B占用
// 这就形成了死锁,两个线程都无法继续执行
} else {
System.out.println("Thread B: Unable to acquire Resource B. Exiting.");
}
}
}
public class Main {
public static void main(String[] args) {
ThreadA threadA = new ThreadA(5);
ThreadB threadB = new ThreadB(2);
// 启动两个线程
new Thread(threadA).start();
new Thread(threadB).start();
System.out.println("主线程:等待两个线程执行完毕 ...");
// 线程A和线程B执行完成后,会各自打印退出信息
// 此时主线程可以输出"主线程:等待两个线程执行完毕 ...线程已全部退出。"
// 说明所有的任务都已经执行完成
}
}
```
这个示例中,两个线程分别尝试获取资源A和B。由于资源的获取顺序错误(线程B先获取了资源B),导致形成了死锁。主线程需要等待所有线程执行完毕。
还没有评论,来说两句吧...