Проясните пожалуйста ситуацию!
Подскажите если у нас синхронизированы оба метода и нить входит например в сетер, то мютекс у нас ставиться на этот методи или на метод и переменную value или на все синхронизирование методы в которых используеться эта переменная?
Буду благодарен за любую информацию по этому вопросу, так как гугл что то не сильно мне помог(
Андрей
33 уровень
Зачем синхронизировать геттер?
Решен
Комментарии (1)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Max
3 мая 2020, 06:14решение
Мютекс блокирует объект, а не метод или переменную. Объектом блокировки может быть экземпляр или класс (в случае статической синхронизации).
В данной задаче синхрониpируются 2 метода, а это означает, что если одна нить работает с экземпляром IntegerHolder (скажем, вызывает get()), то другая нить, которая работает с тем же экземляром, будет в состоянии BLOCKED и не сможет вызвать ни get(), ни set() до тех пор, пока первая нить не отпустит монитор - экземпляр (объект) IntegerHolder.
У вас в названии темы есть вопрос "Зачем синхронизировать геттер?". И он не лишен смысла. Первую попытку решения (которую не принял валидатор) я сделал как: поле value пометил volatile, а метод set() как synchronized. Таким образом, я хотел чтобы get() мог выполнятся одновременно из разных потоков, что не нарушило бы целостность данных и возможно ускорило программу (я так думал, но это не правильно).
Не учел я вот что: логика метода get() в принципе, а не конкретно в этой задаче, может быть достаточно сложной (с условиями, в зависимости от других параметров и т.д. и т.п.), а это означает, что если get() не синхронизирован, то это точно нарушит целостность данных.
+10