Java多线程并发问题:死锁、饥饿等现象的示例

原创 蔚落 2024-10-22 17:39 103阅读 0赞

在Java多线程环境中,死锁、饥饿等问题可能会出现。以下是两个示例:

  1. 死锁示例:
    ```java
    // 定义两个线程,分别拥有资源A和B
    class ThreadA implements Runnable {
    private int resourceA;

    ThreadA(int resourceA) {

    1. this.resourceA = resourceA;

    }

    @Override
    public void run() {

    1. System.out.println("Thread A: Acquiring Resource A (" + resourceA + ") ...");
    2. // 线程A获得资源A后,尝试获取资源B
    3. if (resourceA > 0) {
    4. resourceA--;
    5. System.out.println("Thread A: Acquiring Resource B (" + resourceB + ") ...");
    6. // 线程B需要资源A才能继续执行,但资源A已经被线程A占用
    7. // 这就形成了死锁,两个线程都无法继续执行
    8. } else {
    9. System.out.println("Thread A: Unable to acquire Resource A. Exiting.");
    10. }

    }
    }

class ThreadB implements Runnable {
private int resourceB;

  1. ThreadB(int resourceB) {
  2. this.resourceB = resourceB;
  3. }
  4. @Override
  5. public void run() {
  6. System.out.println("Thread B: Acquiring Resource B (" + resourceB + ") ...");
  7. // 线程B获得资源B后,尝试获取资源A
  8. if (resourceB > 0) {
  9. resourceB--;
  10. System.out.println("Thread B: Acquiring Resource A (" + resourceA + ") ...");
  11. // 线程A需要资源B才能继续执行,但资源B已经被线程B占用
  12. // 这就形成了死锁,两个线程都无法继续执行
  13. } else {
  14. System.out.println("Thread B: Unable to acquire Resource B. Exiting.");
  15. }
  16. }

}

public class Main {
public static void main(String[] args) {
ThreadA threadA = new ThreadA(5);
ThreadB threadB = new ThreadB(2);

  1. // 启动两个线程
  2. new Thread(threadA).start();
  3. new Thread(threadB).start();
  4. System.out.println("主线程:等待两个线程执行完毕 ...");
  5. // 线程A和线程B执行完成后,会各自打印退出信息
  6. // 此时主线程可以输出"主线程:等待两个线程执行完毕 ...线程已全部退出。"
  7. // 说明所有的任务都已经执行完成
  8. }

}
```

这个示例中,两个线程分别尝试获取资源A和B。由于资源的获取顺序错误(线程B先获取了资源B),导致形成了死锁。主线程需要等待所有线程执行完毕。

文章版权声明:注明蒲公英云原创文章,转载或复制请以超链接形式并注明出处。

发表评论

表情:
评论列表 (有 0 条评论,103人围观)

还没有评论,来说两句吧...

相关阅读