我确实意识到这个话题已在很多地方进行过讨论。但他们都讨论了它在多线程环境中的用法。
在以下示例中,为什么notify()
应该被synchronized
包围?当使用关键字时,它应该是徒劳的。但是为什么异常java.lang.IllegalMonitorStateException
,当它没有被使用时?
public class HelloWorld {
public static void main(String[] args) {
ABC c = new ABC();
c.put(0);
}
}
class ABC {
public synchronized void put(int value) { // why synchronized now!
System.out.println("Put: " + value);
notify();
}
}
答案 0 :(得分:0)
你应该使用synchronized
是因为锁是re-entrant
,这意味着它可以被同一个线程多次获取。
换句话说,如果你的线程已经锁定了一个对象,它就不必等待自己。