![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
Pawl |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 649 Регистрация: 22.4.2008 Где: Витебск Репутация: 7 Всего: 28 |
Доброго времени суток, возможно, все слышали про сабж - это там, где философы сидят в кружок за столом, покушают спагетти, потом подумают, потом опять покушают и т. д., пока спагетти не кончатся. Проблема состоит в том, что спагетти надо есть 2-мя вилками, а количество вилок на столе совпадает с количеством философов. Поэтому некоторые философы, для того чтобы поесть, должны ждать освобождения вилок. Обычно эту задачу приводят, как демонстрацию синхронизации и дедлоков. Я сперва ее реализовал с использованием synchronized и volatile там, где посчитал нужным, а потом для интереса их убрал. Так вот, это нисколько не повлияло на работу программы! Т. е. никакой одновременности в поедании спагетти сразу всеми философами не случилось, хотя, на сколько я понимаю, она должна быть. Вот исходный код классов программы:
Вилка -
тарелка -
философ -
стол -
Я считаю, что в методе eat класса Philosopher два философа, впринципе, могут одновременно захватить одну и ту же вилку, т. к. доступ к вилкам не синхронизирован. Кроме того, значение переменной free у вилки, по идее, кэшируется потоками, т. е. другой поток может не сразу узнать ее текущее значение. Изначально я объявил метод eat как synchronized, а переменную free - как volatile. Потом убрал эти объявления, результат работы остался тем же. Буду благодарен, если объясните почему. Спасибо! -------------------- В действительности всё совсем не так, как на самом деле |
||||||||
|
|||||||||
Pawl |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 649 Регистрация: 22.4.2008 Где: Витебск Репутация: 7 Всего: 28 |
На 'дцатом запуске мои подозрения подтвердились!
![]() Блин, хотел на примере этого продемонстрировать принципы синхронизации, но как можно, если разница возникает только после многочисленных запусков ![]() Это сообщение отредактировал(а) Pawl - 27.3.2013, 14:40 -------------------- В действительности всё совсем не так, как на самом деле |
|||
|
||||
batigoal |
|
|||
![]() Нелетучий Мыш ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6423 Регистрация: 28.12.2004 Где: Санктъ-Петербургъ Репутация: 24 Всего: 151 |
Pawl, если бы она проявлялась каждый раз, то проблемы многопоточности не были бы такими геморройными =)
Я не смотрел текст, но обычно можно повысить вероятность до почти 100% за счет sleep-ов в выполняемых потоках и паузах между их запуском (например, секунда задержки в цикле-worker'е и полсекунды между их стартом). -------------------- "Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли) ЖоржЖЖ |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |