| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java: Общие вопросы > synchronized |
| Автор: Elene 8.12.2004, 19:39 | ||
Пожалуйста, объясните мне что такое synchronized, что и с чем он синхонизирует, по какому принципу, и почему вывод этой программы происходит именно в такой последовательности. Экзамен на носу, а я совершенно не въезжаю в этот код. Спасите, пожалуйста...
|
| Автор: Domestic Cat 8.12.2004, 20:06 | ||||
| Большой вопрос 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 8.12.2004, 20:19 |
| Теперь по программе. Запускаем прогу, создается поток . Он создает поток тестер и запускает его. Далее возможны 2 варианта. а. входит в синхронизированный блок, предварительно отобрав лок от объекта , первее, чем поток успел выполнить. Тогда порядок будет таким, как указано: не может выполнить т.к. для этого ему нужно получить лок от , а этот лок у . Тем не менее, возможны 2 варианта: 1 2 3 4 5 2 1 3 4 5 б. поток выполняет первым, и первым получает лок. Тогда получим кучу вариантов: 2 1 4 3 5 1 2 4 5 3 ..... Все это теоретически, ведь нигде не написано как будет распределено время выполнения. Реально будет почти всегда 1 и тот же порядок. |
| Автор: Elene 8.12.2004, 21:02 |
| СпасибоБ я все прочитала, но особенной ясности в понимании моего кода это не прибавило. На уровне, что 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 8.12.2004, 22:02 |
| Спасибо, когда я писала последний постинг, Ваш ответ по программе был не виден. А не подскажите еще, как в группе тредов MyGroup вывести на экран приоритеты всех ее тредов. |
| Автор: Domestic Cat 8.12.2004, 22:21 | ||
|
| Автор: Elene 8.12.2004, 22:36 |
| Спасибо. Можно я еще спрошу: что называют смертью треда? Это когда он полностью выполнился или, наоборот, когда не может выполнился по каким-либо причинам? После run() или мэйн, его как считать мертвым или живым? |
| Автор: Domestic Cat 8.12.2004, 22:51 |
| Тред умирает когда метод run выполнен. |
| Автор: Elene 9.12.2004, 17:31 |
| Большое спасибо за все. Статья, на которую Вы указали, мне тоже очень помогла. Ее автору тоже большое спасибо. С экзаменом все в порядке. |
| Автор: Domestic Cat 9.12.2004, 17:37 | ||
Поздравляю |
| Автор: ParaPik 31.3.2009, 16:54 |
| А в чем особенность применения модификатора synchronized со static методами? Я такое увидел в объявлении класса System стандартной библиотеки Java. |
| Автор: powerOn 31.3.2009, 19:02 |
| Особенность в том, что синхронизация происходит на class объекте типа, метод которого вызывается. Для нестатических методов синхронизация на this. |
| Автор: ParaPik 31.3.2009, 21:06 |
| Спасибо. Все ясно. |