Коллеги, возник такой вопрос - обязательно ли все методы должны быть синхронизированы (ясно, что это требование задачи)? А по логике: тем методам, которые что-то меняют в списке, синхронизация необходима. А вот методы, которые ничего не изменяют, а лишь выдают определенную информацию о коллекции, - обязательна ли для них синхронизация?
Elena
26 уровень
Вопрос по синхронизации методов
Обсуждается
Комментарии (6)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
--------Master
12 марта 2019, 07:59
По идее, за время работы метода получения информации другой поток также может внести изменнеия, и возвращенная информация может оказаться неактуальной. Например, добавление в ячейку с несинхронизированным size(), за время работы size изменился - добавление перезапишет последнюю ячейку
0
Elena
12 марта 2019, 09:09
Спасибо большое за Ваш ответ.
То есть, правильно ли я понимаю, что несинхронизированный метод из потока может обратиться к объекту и сделать что-то несмотря на блокировку его mutex синхронизированным методом из другого потока?
0
--------Master
12 марта 2019, 09:12
Скорее наоборот - синхронизированный может сделать что-то во время работы несинхронизированного, т.к. мютекс свободен
0
Elena
12 марта 2019, 09:35
Логично. Спасибо. А вообще несинхронизированный метод из потока может обратиться к объекту, если его mutex уже блокирован другим потоком?
0
--------Master
12 марта 2019, 12:26
Тоже стало это интересно, попробовал еще раз с этим делом поразбираться, набросал тестовый код для проверки - опять перестал что-либо понимать, что вообще этот synchronized делает и делает ли он что-либо вообще...
Вывод:
Т.е. спокойно себе обращается к переменной, находящейся в блоке синхронизации, делает с этой переменной что угодно и ноль внимания на все эти мютексы и synchronized-ы. Или просто все забыл с того времени, как читал об этом, и должно работать как-то совсем по-другому... 0
Elena
15 марта 2019, 08:07
Поэкспериментировала с Вашим кодом и пришла к такому же выводу, что несинхронизированный метод из другого потока беспрепятственно меняет данные объекта, никак не реагируя на блокированный мютекс. Однако, если сделать поле private, а геттеры и сеттеры synchronized, тогда, конечно, они все ждут друг друга...
У меня мало опыта, поэтому допускаю, что может есть какой-то иной способ написания кода в подобной ситуации.
0