| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java: Общие вопросы > spurious wakeup |
| Автор: revenforv 1.9.2009, 17:02 | ||||
Недавно натолкнулся на такой вот абзац в документации по j2se:
В общем речь про spurious wakeup, т.е. когда поток пробуждается по какой-то мистической причине, а не по вызову нотификаторов, истечению таймаута или прерыванию. В общем, разработчики советуют использовать вместо if(!condition) obj.wait(..); конструкцию описанную выше (т.е. с while). Кому-нибудь в практике программирования встречался случай таких spurious wakeup'ов? Единственный параноидальный вариант, который мне удалось придумать:
Есть вероятность что другая пара YYYWaiter и YYYNotifier, которые к первым двум не имеют никакого отношения тоже используют "" как объект неявной блокировки. А поскольку в java обращения к строкам могут быть оптимизированы, то с "" будет связан один объект блокировки и значит XXXWaiter и YYYWaiter помещены в одну очередь ожидания. Когда YYYNotifier вызовет notifyAll() из очереди выпадут оба, хотя XXXWaiter по-идее и не должен бы, т.к. его мало волнуют условия, покоторым блокируется пара YYY. Пример, конечно искусственный, но вот поэтому и спрашиваю. Может кто знает, более реальный пример? |
| Автор: LSD 1.9.2009, 18:27 |
Пример вообще не по теме. В этом примере оба объекта будут использовать один и тот же объект (http://javatechniques.com/public/java/docs/basics/string-equality.html). Я лично с таким не сталкивался, но судя по всему spurious wakeup происходит случайно и практически не воспроизводим. Полагаю что это связанно с механизмами синхронизации которые предоставляются ОС или еще какой нибудь внутренней причиной, связанной с особенностями реализации JVM. Возможно что в современных JVM это и не происходит вовсе. |
| Автор: COVD 1.9.2009, 18:28 | ||
Причина сбоя не в коде программы, а в особенностях некоторых операционных систем. Это редкий внутренний сбой, от которого рекомендуют на всякий случай защищаться. Нет смысла пытаться воспроизвести ситуацию средствами java. |
| Автор: revenforv 1.9.2009, 19:17 |
| Ясно. Ответ понятен - вопрос снят. |