Всем привет. Разбираю сейчас тему многопоточности, но не могу понять что такое мониторы.
В статье про сихронизацию на javarush написано:
Задача мьютекса — обеспечить такой механизм, чтобы доступ к объекту в определенное время был только у одного потока. Если Поток-1 захватил мьютекс объекта А, остальные потоки не получат к нему доступ, чтобы что-то в нем менять. До тех пор, пока мьютекс объекта А не освободится, остальные потоки будут вынуждены ждать.Не нужно ничего делать, чтобы создать мьютекс: он уже встроен в класс Object, а значит, есть у каждого объекта в Java.
Далее приведен пример:
Правильно ли я понимаю, что мьютенсом в данном примере является объект obj?
А если метод статический, то им являеется класс?
adoonaai
16 уровень
Многопоточность (мониторы)
Решен
Комментарии (6)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Стас Пасинков Software Developer в Zipy Master
15 июля 2021, 22:57
мьютенсом в данном примере является объект obj
не совсем так.
obj в данном случае (когда мы синхронизируемся по нему) лучше назвать монитором.
а мьютекс - это такая внутренняя часть любого джава-объекта, которая, собственно, и блокируется.
там же дальше в статье подробнее объясняется с примерным примером кода. где у обджекта берется мьютекс, и блокируется по нему.
в общем, муторно немного, да. просто такая терминология.
если коротко, то монитор - это сам объект, а мьютекс - эта та внутрення часть такого объекта, которая, собственно, и блокируется. и тогда с самим объектом мы продолжаем спокойненько себе работать внутри synchronized блока/метода, потому что заблокирован не сам этот объект, а только одна его часть - мьютекс
+1
Ирина Алымова Java Developer в Nerdysoft
14 июля 2021, 21:20
Да, все верно, монитором может быть и объект, и сам класс.
+1
adoonaai
15 июля 2021, 13:17
Спасибо большое!
Подскажите, может знаете ответ на эти вопросы, нигде не смог найти ответа:
1) Когда лучше использовать Synchronized метод, а когда блок ?
2) Какие операции в Synchronized блоке не стоит выполнять ?
Спасибо!
0
Ирина Алымова Java Developer в Nerdysoft
15 июля 2021, 15:06
1) тут пусть подскажут другие, рельной практики не было у меня, предполагаю что блок стоит использовать, если код должен выполняться единоразово, метод если он вызывается несколько раз (а в принципе работы они равнозначны)
2) в этом блоке стоит выполнять только операции с монитором, остальное лучше вынести за
0
Стас Пасинков Software Developer в Zipy Master
15 июля 2021, 23:06решение
1. решаешь сам :) если у тебя метод, где выполняется куча всего, и ты планируешь синхронизироваться по методу целиком - то это получится "узкое место". потому что та куча работы, которая могла бы выполняться другими потоками параллельно - не будет так выполняться. ведь мы заблокировали доступ на выполнение этого метода целиком.
на самом деле, когда ты помечаешь метод словом synchronized - в байткоде сам метод не синхронизирован, а просто внутри него от его начала и до самого конца создается огромный такой блок синхронизации на весь код метода.
для примера, у тебя есть такой вот метод:
если ты тут пометишь весь метод myMethod() целиком ключевым словом synchronized - то у тебя программа будет тупить и медленно работать, потому что все треды будут ждать пока первый сделает длинную операцию, короткую и снова длинную. потом второй тред делает длинную операцию, короткую и снова длинную, итд.
хотя на самом деле те две длинные операции и не требуют быть синхронизированными, а можно было бы их делать параллельно (все треды одновременно ждут данных каждый сам для себя).
вот в таком случае, конечно, нет смысла целый метод помечать как synchronized, а достаточно поместить только ту короткую часть в синхронизированный блок.
но когда у тебя, например, простой геттер, и ты не хочешь париться писать в нем еще блок синхронизации отдельно - тогда да, лупанул synchronized на метод - и все :) +2
Стас Пасинков Software Developer в Zipy Master
15 июля 2021, 23:09решение
2. те, которые не требуют синхронизации, которые не надо выполнять по очереди.
чаще всего, будет проще понять какие операции должны быть синхронизированы. так вот все остальные - не надо помещать в синхронизированный блок :)
+2