![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| Pawl |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 649 Регистрация: 22.4.2008 Где: Витебск Репутация: 7 Всего: 28 |
Доброго времени суток!
Так получилось, что я должен объяснить пример deadlok'a, используя синхронизированные методы. Написал для этого простенькую программку, прикинул, как ее пояснить и подумал, что лучше вначале спросить знающих людей, а правильно ли я все сам понимаю? Поскольку поблизости таковых не оказалось, прошу Вас посмотреть, насколько верны и понятны мои пояснения. Привожу сначала код, а затем то, как я его собираюсь пояснять.
Пояснение: По команде t1.start() основной поток программы автоматически запускает синхронизированный метод run объекта t1. Тем самым создается новый поток, а объект t1 блокируется основным потоком. Тоже происходит по команде t2.start() с объектом t2. На объекте t1 из метода run делается попытка доступа к объекту t2, который, уже заблокирован основным потоком. Поэтому попытка не удается, а метод run() объекта t1 останавливается и ждет разблокировки t2. Сам t1 остается заблокированным и разблокируется только тогда, когда его метод run завершит свою работу. Из t2, в свою очередь, делается попытка обращения к t1, тоже безуспешная, т. к. t1 также заблокирован основным потоком. Поэтому метод run() объекта t2 не может завершиться и t2 остается заблокированным. Спасибо заранее за консультацию! -------------------- В действительности всё совсем не так, как на самом деле |
|||
|
||||
| Pawl |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 649 Регистрация: 22.4.2008 Где: Витебск Репутация: 7 Всего: 28 |
Товарисчи, а-у!
-------------------- В действительности всё совсем не так, как на самом деле |
|||
|
||||
| Temdegon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 429 Регистрация: 11.10.2008 Где: Minsk Репутация: 7 Всего: 9 |
Честно признаюсь, разбиратсья лень.
Вот линк на отличную статью про синхронизацию потоков. http://skipy.ru/technics/synchronization.html Очень доступно написано. Как раз там есть пример дэдлока. Если статья вам поможет - ее автор, Skipy, тоже на этом форуме, не забудьте ему плюсик начислить =) |
|||
|
||||
| Pawl |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 649 Регистрация: 22.4.2008 Где: Витебск Репутация: 7 Всего: 28 |
Согласен, уважительная причина, как я ее понимаю -------------------- В действительности всё совсем не так, как на самом деле |
|||
|
||||
| jk1 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1168 Регистрация: 17.10.2008 Где: Санкт-Петербург Репутация: 40 Всего: 75 |
1.
Почему основным? Владельцем монитора будет поток t1. Основной поток, который постоянно упоминается в описании, в блокировке не учавствует вовсе, deadlock происходит между потоками t1 и t2. 2. Зачем сделано два практически одинаковых класса? Они отличаются только константой. 3. Кроме того, непонятно зачем под инициализацию изобретать отдельный метод, для этого же конструктор есть. Но это так, мелочь. Это сообщение отредактировал(а) jk1 - 23.3.2011, 13:17 -------------------- Opinions are like assholes — everybody has one |
|||
|
||||
| Pawl |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 649 Регистрация: 22.4.2008 Где: Витебск Репутация: 7 Всего: 28 |
Спасибо за конструктивный ответ!
Вообще-то я читал, что монитор на объект захватывает поток, который вызвал на этом объекте синхронизированный метод. Тут ведь основной поток вызывает синхронизированный метод run на объектах t1 и t2, значит он их и блокирует, нет?
Просто в t1 надо было как-то передать t2 и наоборот. И если бы я написал что-то вроде
компилятор меня бы наверное не понял. -------------------- В действительности всё совсем не так, как на самом деле |
||||
|
|||||
| jk1 |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1168 Регистрация: 17.10.2008 Где: Санкт-Петербург Репутация: 40 Всего: 75 |
Все правильно Вы читали, вот только основной поток вызывает не метод run(), а метод start(). Start() в свою очередь запускает новый поток, и уже этот новый поток вызовет синхронизированный метод run(). Это сообщение отредактировал(а) jk1 - 25.3.2011, 10:39 -------------------- Opinions are like assholes — everybody has one |
||||
|
|||||
| Pawl |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 649 Регистрация: 22.4.2008 Где: Витебск Репутация: 7 Всего: 28 |
Действительно, написано же не t1.run(), a t1.start()! Спасибо огромное, помогли разобраться, тему закрываю. -------------------- В действительности всё совсем не так, как на самом деле |
|||
|
||||
![]()
|
| Правила форума "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. |