Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> spurious wakeup, кто-нибудь салкивался? 
V
    Опции темы
revenforv
Дата 1.9.2009, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 6.8.2009
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Недавно натолкнулся на такой вот абзац в документации по j2se:
Цитата

A thread can also wake up without being notified, interrupted, or timing out, a so-called spurious wakeup. While this will rarely occur in practice, applications must guard against it by testing for the condition that should have caused the thread to be awakened, and continuing to wait if the condition is not satisfied. In other words, waits should always occur in loops, like this one:

     synchronized (obj) {
         while (<condition does not hold>)
             obj.wait(timeout);
         ... // Perform action appropriate to condition
     }


В общем речь про spurious wakeup, т.е. когда поток пробуждается по какой-то мистической причине, а не по вызову нотификаторов, истечению таймаута или прерыванию.
В общем, разработчики советуют использовать вместо if(!condition) obj.wait(..); конструкцию описанную выше (т.е. с while).
Кому-нибудь в практике программирования встречался случай таких spurious wakeup'ов?

Единственный параноидальный вариант, который мне удалось придумать:
Код

// part of XXXWaiter works with XXXNotifier

String obj="";

public void foo() {
    // pre-actions
    synchronized(obj) {
        if(!condition)
            obj.wait(timeout);
        // post-actions
    }
}


Есть вероятность что другая пара YYYWaiter и YYYNotifier, которые к первым двум не имеют никакого отношения тоже используют "" как объект неявной блокировки. А поскольку в java обращения к строкам могут быть оптимизированы, то с "" будет связан один объект блокировки и значит XXXWaiter и YYYWaiter помещены в одну очередь ожидания. Когда YYYNotifier вызовет notifyAll() из очереди выпадут оба, хотя XXXWaiter по-идее и не должен бы, т.к. его мало волнуют условия, покоторым блокируется пара YYY.

Пример, конечно искусственный, но вот поэтому и спрашиваю. Может кто знает, более реальный пример?
PM MAIL Skype   Вверх
LSD
Дата 1.9.2009, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(revenforv @  1.9.2009,  17:02 Найти цитируемый пост)
Пример, конечно искусственный, но вот поэтому и спрашиваю.

Пример вообще не по теме. В этом примере оба объекта будут использовать один и тот же объект (String Equality and Interning).



Я лично с таким не сталкивался, но судя по всему spurious wakeup происходит случайно и практически не воспроизводим. Полагаю что это связанно с механизмами синхронизации которые предоставляются ОС или еще какой нибудь внутренней причиной, связанной с особенностями реализации JVM. Возможно что в современных JVM это и не происходит вовсе.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
COVD
Дата 1.9.2009, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 17
Всего: 43



Цитата

Пример, конечно искусственный, но вот поэтому и спрашиваю. Может кто знает, более реальный пример?

Причина сбоя не в коде программы, а в особенностях некоторых операционных систем. Это редкий внутренний сбой, от которого рекомендуют на всякий случай защищаться. Нет смысла пытаться воспроизвести ситуацию средствами java. 
PM MAIL   Вверх
revenforv
Дата 1.9.2009, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 6.8.2009
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Ясно. Ответ понятен - вопрос снят.
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0760 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.