Лучше немного описать код:
class AWTInvocationLock {}
Object lock = new AWTInvocationLock();
InvocationEvent event =
new InvocationEvent(source, runnable, lock, true);
synchronized (lock) {
Toolkit.getEventQueue().postEvent(event);
while (!event.isDispatched()) {
lock.wait();
}
}
Ссылка на объект блокировки выходит за пределы локальной области видимости.Ссылка хранится в объекте InvocationEvent
:
InvocationEvent event =
new InvocationEvent(source, runnable, lock, true);
Поток отправки EventQueue
прослушивает опубликованные объекты Event.Поток вызывает метод dispatch()
для каждого события.Я не смотрел исходный код, но думаю, что псевдокод метода InvocationEvent.dispatch()
выглядит следующим образом:
1. synchronize(lock)
2. runnable.run() -- store any exceptions to a "throwable" reference variable
3. lock.notify()
Таким образом, поток диспетчеризации EventQueue
вызывает notify()
объекта блокировки, который освобождает поток, вызывающий invokeAndWait()
из вызова wait()
в следующей строке.
Есть ли разница между блокировкой, созданной из класса и из объекта?
AWTInvocationLock
- это именованный внутренний класс с областью действия метода.Я никогда не видел никого в дикой природе.Это действительно неясная часть языка, и та, о которой почти никто из моих знакомых не знает.Я бы никогда не использовал его из-за этого и потому, что Javadoc даже не распознает их и не будет генерировать для них документацию!