我正在尝试创建一个Java死锁程序。我知道实时我们不会在线程中创建任何死锁。不幸的是,我在一次采访中被要求写一个“使用两个线程的死锁程序”。所以这就是
package Thread.DeadLock;
public class deadLock2 {
static ThreadSample1 t1 = new ThreadSample1();
static ThreadSample2 t2 = new ThreadSample2();
public static void main(String args[]) {
t1.start();
t2.start();
}
public static class ThreadSample1 extends Thread {
public void run() {
System.out.println("In first run method");
try {
System.out.println("Holding lock in first one");
synchronized (t1) {
System.out.println("t1 going to wait for t2");
t1.wait();
System.out.println("t1 finished for waiting");
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static class ThreadSample2 extends Thread {
public void run() {
System.out.println("In second run method");
try {
System.out.println("Holding lock for second one");
synchronized (t2) {
System.out.println("t2 going to wait for t1");
t2.wait();
System.out.println("t2 finished for waiting");
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
我可以看到程序卡住了。我假设它处于死锁状态。 t1.start()等待t2完成其任务,t2.start()等待t1完成其任务。现在,当我尝试通过使用t1.notify()通知等待线程来删除死锁时,我得到了IllegalMonitorStateException。 在这种情况下,有人可以告诉如何在不造成任何情况的情况下消除死锁。
答案 0 :(得分:2)
首先,这不是死锁。正如您所描述的那样,死锁通常是两个或多个线程之间存在循环依赖关系,等待其他线程持有的资源。
这里,每个线程独立地等待自己的通知,这实际上不是系统中任何其他人传递的。即使没有僵局。
其次,IllegalMonitorStateException
表示您尝试在监视器上通知/等待线程未持有。换句话说,synchronized
/ notify
之前没有wait
。
第三,要实现真正的僵局,你可以做这样的事情:
synchronized(t1) {
synchronized(t2) {
t2.wait();
}
t1.notify();
}
,反之亦然另一个帖子。
答案 1 :(得分:0)
除非当前线程拥有该对象的监视器,否则无法调用notify()/notifyAll()
。为此,您必须像对wait()
Javadocs for wait()
提到这个:
此方法只能由作为此对象监视器所有者的线程调用。有关线程成为监视器所有者的方式的说明,请参阅
抛出:notify
方法。
IllegalMonitorStateException
- 如果当前主题不是此对象监视器的所有者。
来自notify()
:
线程成为对象监视器的所有者之一 方法:
- 执行该对象的同步实例方法。
- 执行在对象上同步的
synchronized
语句的正文。- 对于
Class
类型的对象,通过执行该类的同步静态方法。
看到这个答案:
答案 2 :(得分:0)
for Frame use
record
Transaction_Id at 0 range 0 .. 15;
Protocol_Id at 2 range 0 .. 15;
Frame_Length at 4 range 0 .. 15;
Unit_id at 6 range 0 .. 7;
Function_Code at 7 range 0 .. 6;
Is_Exception at 7 range 7 .. 7;
end record;