![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
Elene |
|
|||
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 26.9.2004 Репутация: нет Всего: нет |
Пожалуйста, объясните мне что такое synchronized, что и с чем он синхонизирует, по какому принципу, и почему вывод этой программы происходит именно в такой последовательности. Экзамен на носу, а я совершенно не въезжаю в этот код. Спасите, пожалуйста...
|
|||
|
||||
Domestic Cat |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 50 Всего: 172 |
Большой вопрос
![]() 1. synchronized cинхронизирует потоки. Понятно, что можно запустить несколько потоков. Теперь представь, что всем этим потокам передали ссылку на один и тот же объект с методом method(). Потоки эти выполняются "почти одновременно", то есть, специальный поток распределяет время выполнения - сначала 1 тред выполняется в течение скажем, 20 мс, затем второй, итп. (Одновременно выполняться они не могут). Соответственно, любой поток может быть приостановлен в любой момент времени, и управление будет передано другому потоку. Теперь предположим что метод такой
Потоки 1 и 2 имеют ссылку на 1 и тот же объект. Поток 1 выполняет строку
и изменяет х. Тут он приостанавливается, и продолжает работу поток 2, который тоже входит в этот метод и выполняет его полностю. Понятно, что после этого поток 1 будет работать с неверными данными, т.к. х уже была изменена потоком номер 2. synchronized нужен для того, чтобы потоки синхронизировать, т.е. если один поток начал выполнять синхронизированный метод, никакой другой поток не может туда войти. Делается это за счет того, что поток получает некий объект, называемый "лок"; без этого лока зайти в synchronized блок нельзя. http://forum.vingrad.ru/index.php?showtopic=24781 -------------------- |
||||
|
|||||
Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 50 Всего: 172 |
Теперь по программе.
Запускаем прогу, создается поток . Он создает поток тестер и запускает его. Далее возможны 2 варианта. а. входит в синхронизированный блок, предварительно отобрав лок от объекта , первее, чем поток успел выполнить. Тогда порядок будет таким, как указано: не может выполнить т.к. для этого ему нужно получить лок от , а этот лок у . Тем не менее, возможны 2 варианта: 1 2 3 4 5 2 1 3 4 5 б. поток выполняет первым, и первым получает лок. Тогда получим кучу вариантов: 2 1 4 3 5 1 2 4 5 3 ..... Все это теоретически, ведь нигде не написано как будет распределено время выполнения. Реально будет почти всегда 1 и тот же порядок. -------------------- |
|||
|
||||
Elene |
|
|||
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 26.9.2004 Репутация: нет Всего: нет |
СпасибоБ я все прочитала, но особенной ясности в понимании моего кода это не прибавило. На уровне, что 2 треда не могут запускаться одновременно мне понятно. Мне не понятно, по какой логике я должна читать подобные примеры, чтобы увидеть, что получится в результате (это надо делать без компа, так сказать в уме или на бумаге). Поэтому я хотела бы уточнить алгоритм. Пойдем по пунктам, если можно. Поправьте, пожалуйста, если что не так:
1)Вот, захожу я в мэйн и, если вижу там блок синхронайзд, я должна откинуть, все инструкции, которые заданы выше и начаю читать с него. Так? Выполняется - System.out.println( "In Block"); //1 2) Затем я вижу, Thread.currentThread().sleep( 5000); Думаю, что currentThread() - это сам синхронайзд, и понимаю, что команда System.out.println( "End run"); не должна выполняться прямо сейчас. Кстати, вот, не понятно, если он уснул на 5 сек, то по идее все остальные команды должны успеть выполниться, и "End run" должно появиться в последнию очередь, но я вижу, что это не так. 3)Вот дальше совсем не понятно, куда идти и почему. 4)Как понять: public synchronized void enter() в классе LockTest? Как изменяется функция, если к ней добавляется synchronized? Чля ей это дает? Остальные пункты мне пока не по силам. В общем, если можно, я бы хотела краткое объяснение, почему программа переходит именно к инструкции под номером 2, а затем к 3, 4 и 5, почему именно в такой последовательности. Как нужно читать такой код, чтобы получить правильный выход. Я понимаю, что вопрос большой, но мне очень хочется разобраться, если можно... |
|||
|
||||
Elene |
|
|||
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 26.9.2004 Репутация: нет Всего: нет |
Спасибо, когда я писала последний постинг, Ваш ответ по программе был не виден.
А не подскажите еще, как в группе тредов MyGroup вывести на экран приоритеты всех ее тредов. |
|||
|
||||
Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 50 Всего: 172 |
-------------------- |
|||
|
||||
Elene |
|
|||
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 26.9.2004 Репутация: нет Всего: нет |
Спасибо.
Можно я еще спрошу: что называют смертью треда? Это когда он полностью выполнился или, наоборот, когда не может выполнился по каким-либо причинам? После run() или мэйн, его как считать мертвым или живым? |
|||
|
||||
Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 50 Всего: 172 |
Тред умирает когда метод run выполнен.
-------------------- |
|||
|
||||
Elene |
|
|||
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 26.9.2004 Репутация: нет Всего: нет |
Большое спасибо за все. Статья, на которую Вы указали, мне тоже очень помогла. Ее автору тоже большое спасибо. С экзаменом все в порядке.
|
|||
|
||||
Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 50 Всего: 172 |
Поздравляю ![]() -------------------- |
|||
|
||||
ParaPik |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 132 Регистрация: 8.1.2009 Репутация: нет Всего: нет |
А в чем особенность применения модификатора synchronized со static методами? Я такое увидел в объявлении класса System стандартной библиотеки Java.
|
|||
|
||||
powerOn |
|
|||
![]() software saboteur ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4367 Регистрация: 7.10.2005 Репутация: 47 Всего: 159 |
Особенность в том, что синхронизация происходит на class объекте типа, метод которого вызывается. Для нестатических методов синхронизация на this.
|
|||
|
||||
ParaPik |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 132 Регистрация: 8.1.2009 Репутация: нет Всего: нет |
Спасибо. Все ясно.
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |