Java 显示一个带有信号量的死锁的简单示例

Java 显示一个带有信号量的死锁的简单示例,java,deadlock,semaphore,Java,Deadlock,Semaphore,我目前正在学习操作系统,我们的老师给我们的实验室布置了这个问题,但他帮不了什么忙。因此,我需要展示一个带有信号量的死锁的基本示例,我的输出需要演示死锁的发生。我想他是说如果我的例外被抓住了。这是我得到的最接近的 import java.util.concurrent.Semaphore; public class deadlockTest2 { private Semaphore sem1=new Semaphore(1); private Semaphore sem2=new

我目前正在学习操作系统,我们的老师给我们的实验室布置了这个问题,但他帮不了什么忙。因此,我需要展示一个带有信号量的死锁的基本示例,我的输出需要演示死锁的发生。我想他是说如果我的例外被抓住了。这是我得到的最接近的

import java.util.concurrent.Semaphore;
public class deadlockTest2
{
    private Semaphore sem1=new Semaphore(1);
    private Semaphore sem2=new Semaphore(1);
    private int num;

    public deadlockTest2(int random)
    {
            num=random;
    }
    public void run()
    {
        try 
        {
            sem1.acquire();
        }
         catch (InterruptedException e)
        {
            System.out.println("I am deadlocked");}
        }

    public static void main(String[] args)
    {
        deadlockTest2 tester=new deadlockTest2(5);
        deadlockTest2 tester2=new deadlockTest2(20);
        tester.run();
        tester2.run();
    }   
}
~
~

我离你很近吗?我一直在读材料,但没有完全掌握。我想我不明白什么是过程。请有人帮忙。

当两个或多个进程都互相阻止完成执行时,会发生死锁。你可以把一个过程看作是一个单独的程序;它们与其他进程同时运行

死锁的一个基本示例是具有两个进程和两个互斥体的程序,其中每个进程都需要访问两个互斥体,但在获取另一个互斥体之前不会释放自己的互斥体。例如:

  • 进程A锁定互斥锁A
  • 进程B锁定互斥锁B
  • 进程A想要锁定互斥锁B,但已被进程B锁定
  • 进程B想要锁定互斥锁A,但已被进程A锁定 注意:互斥量只是一个值为1的信号量

    很容易看出这将永远持续下去,因为两个进程都不会在锁定另一个资源之前释放自己的资源。这两个进程处于死锁状态

    我在实现中看到的第一个问题是,给每个进程一组它们自己的信号量,这不起作用,因为需要在进程之间共享这些信号量。就好像你这样做了:

  • 进程A锁定互斥锁A_A(存在于进程A中)
  • 进程B锁定互斥锁B_B(存在于进程B中)
  • 进程A锁定互斥体B_A(存在于进程A中)
  • 进程B锁定互斥锁A_B(存在于进程B中)
  • 所以,就好像您有四个独立的信号量(每个进程有一个互斥A和一个互斥B),而不是预期的两个

    您想要的应该是以下几点:

    Semaphore sem1 = new Semaphore(1);
    Semaphore sem2 = new Semaphore(1);
    
    public class deadlockTest1 implements Runnable
    {
        public void run()
        {
            sem1.acquire();
            Thread.sleep(1000);
            sem2.acquire();
        }
    }
    
    public class deadlockTest2 implements Runnable
    {
        public void run()
        {
            sem2.acquire();
            Thread.sleep(1000);
            sem1.acquire();
        }
    }
    
    然后在您的主要功能中:

    public static void main(String[] args)
    {
        deadlockTest1 tester1 = new deadlockTest1();
        deadlockTest2 tester2 = new deadlockTest2();
        tester1.run();
        tester2.run();
    }
    

    这应该和我在第一个示例中描述的完全一样。当每个进程第一次运行时,它们都将成功获取自己的互斥锁(A锁sem1,B锁sem2),然后休眠1秒。在唤醒时,它们将各自尝试锁定另一个互斥锁(A try lock sem2,B try lock sem1),但由于这些资源从未被各自的进程释放,因此无法获取它们,因此这两个进程将无限期地阻塞。

    您首先必须了解什么是死锁。抛出的InterruptedException不是死锁。你在谷歌上搜索过“Java死锁”吗?如果有,您会得到解释和示例。死锁是指当进程2尝试访问进程1尚未释放的数据时。同时,进程1尝试访问进程2尚未发布的数据。对吗?我只是不明白如何让进程尝试访问数据。