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();
}
}
~~
我离你很近吗?我一直在读材料,但没有完全掌握。我想我不明白什么是过程。请有人帮忙。当两个或多个进程都互相阻止完成执行时,会发生死锁。你可以把一个过程看作是一个单独的程序;它们与其他进程同时运行 死锁的一个基本示例是具有两个进程和两个互斥体的程序,其中每个进程都需要访问两个互斥体,但在获取另一个互斥体之前不会释放自己的互斥体。例如:
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尚未发布的数据。对吗?我只是不明白如何让进程尝试访问数据。