任何人都可以详细说明为什么下面的代码片段会给出IllegalMonitorStateException吗?我仍然无法找到原因以及何时发生此异常以及锁定当前正在执行的线程而不是对象的目的是什么?
void waitForSignal() {
Object obj = new Object();
synchronized (Thread.currentThread()) {
obj.wait();
obj.notify();
}
}
答案 0 :(得分:2)
为了在obj
上调用等待方法/代码块应在obj
上同步
void waitForSignal() {
Object obj = new Object();
synchronized (obj) {
obj.wait();
obj.notify();
}
}
答案 1 :(得分:1)
synchronized (Thread.currentThread())
没有任何意义,一个线程无法同步(这会产生死锁),你将不得不同步你正在等待的对象:
synchronized (obj)
另外:使用semaphore进行此类工作总是更好
答案 2 :(得分:1)
一般来说,锁定线程对除了没有意义,因为它阻塞了Thread对象本身的操作。例如,线程上的Thread.join()
wait()s完成。这意味着它使用带有wait()
的同步块来等待线程本身。
答案 3 :(得分:1)
您收到该异常是因为您需要在调用obj
,wait()
或notify()
方法之前获取notifyAll()
上的锁定。这些方法旨在提供一种机制,允许线程阻塞,直到满足特定条件。
wait()
方法释放锁定对象,这意味着您需要在释放之前获得锁定。
notify()
和notifyAll()
用于通知等待获取同一对象锁定的其他线程。这就像一个线程告诉其他线程:"Dudes, I don't need the object for now, you can go ahead and use it. Make sure you notify me once you are done."
。
没有真正的场景,你想要自己获得线程锁定。
这是一个代码块,您可以在执行代码块之前等待线程完成。
Thread t = new Thread() {
public void run() {
synchronized (Thread.currentThread()) {
System.out.println("Thread");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
}
}
}
};
t.start();
Thread.sleep(10);//sleep main thread
synchronized (t) {
System.out.println("Main Thread");
}
}
我必须睡觉主线程因为,大部分时间synchronized
块在它自己的线程之前获取锁定。
您可以对join()