IllegalMonitorStateException [дубликат]

У этого вопроса уже есть ответ здесь:

Что может вызвать это, я получаю IllegalMonitorStateException в этом кодексе

synchronized(syncCount){
    syncCount--;
    syncCount.notify();
}

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

13
задан 12 January 2010 в 18:33
поделиться

1 ответ

Тип Integer или похоже? - заменяет Immutable Целое число объект с другим. Поэтому вы звоните уведомление на другом объекте, чем синхронизированы .

Ваш код является эквивалентом:

Integer syncConunt = Integer.valueOf(5);
[...]
synchronized (syncCount) {
    syncCount = Integer.valueOf(syncCount.intValue() + 1);
    syncCount.notify();
}

Вы не одиноки. Еще до J2SE 5.0 я видел пример код, опубликованный в книге, которая присваивала ссылку в синхронизированном блоке. В целом это хорошая идея для отметки полей блокировки Финал .

Другим существенным точком является то, что код, синхронизирующий на объекте, который он не «владеет». Целое число объекты совместно используются ( integer.valueof (int) вернутся точно такой же экземпляр, если они называются со значениями между -128 и 127, и, возможно, дальше). Если это было сделано двумя кусками неродственного кода, то были бы скрытые взаимодействия. Это относится к любому типу, где экземпляры передаются между несвязанным кодом. Общие примеры представляют собой integer , строку , класс (используется статическими синхронизованными методами) и нитью (в реализации Sun, Бывает применяться в качестве блокировки для присоединиться ).

23
ответ дан 1 December 2019 в 22:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: