Проверять программно, предоставляется ли блокировка? - PullRequest
0 голосов
/ 27 января 2011

Как и в методе wait (), если блокировка не вызывается для вызывающего объекта (для wait ()), как при синхронизации для вызывающего объекта, генерируется исключение IllegalMonitorStateException.

Я хочу знать, что

Как и метод wait (), можем ли мы убедиться, что блокировка предоставлена, написав некоторый код?или это делает только JVM ??

Ответы [ 3 ]

4 голосов
/ 27 января 2011

Просто напишите:

synchronized (thing) {
    thing.wait ();
}

Если он еще не заблокирован, он будет заблокирован, а если он уже заблокирован, то все в порядке.

3 голосов
/ 27 января 2011

Вы можете вызвать Thread.holdsLock () , чтобы узнать, удерживается ли блокировка.Однако вы должны разработать свой код так, чтобы вы знали, есть ли у вас блокировка или нет.Вы должны быть в состоянии определить это статически.

Уведомление / ожидание было полезно до Java 5. Если у вас Java 5 или новее, использование библиотеки параллелизма, вероятно, будет лучшим выбором.

РЕДАКТИРОВАТЬ: Я имел в виду параллельный пакет http://download.oracle.com/javase/6/docs/api/java/util/concurrent/package-summary.html, добавленный в 2004 году, http://download.oracle.com/javase/tutorial/essential/concurrency/highlevel.html до того, как это была внешняя библиотека параллелизма.http://gee.cs.oswego.edu/dl/classes/EDU/oswego/cs/dl/util/concurrent/intro.html

0 голосов
/ 27 января 2011

Я не знаю Java, но обычная семантика блокировки заключается в том, что когда вы пытаетесь получить блокировку, вы блокируете ее, пока не получите.Это означает, что нет необходимости проверять, действительно ли вы получили блокировку - когда поток переходит на следующую строку, вы можете быть уверены, что заблокированы.Когда вы начинаете пытаться делать с замками другие вещи, например, пытаетесь проверить, заблокирован он или нет, вы обычно делаете это неправильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...