Объясните, почему в этой задаче не нужна синхронизация трэдов? Мы же в каждом из дочерних ReadThread записываем данные в одну и ту же мапу - общий ресурс. И вообще, что делать, если после прохождения уровня про синхронизацию потоков у меня в голове каша и я так и не научился правильно расставлять synchronized и volatile и прочее ?
Денис Стёпшин
25 уровень
Почему в этой задаче не нужна синхронизация трэдов?
Решен
Комментарии (7)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Wladyslaw Java Developer Master
29 мая 2020, 14:32
Дык нужна, вроде как, все правильно говоришь. Глянул у себя - есть синхронизированный блок, там где статическую мапу использую из потока. Синхронизация по самой мапе.
0
Денис Стёпшин
29 мая 2020, 16:51
я тестил заполнение мапы без синхронизации и увидел, что ее данные не отличаются от запуска к запуску. тыкнул на кнопку проверки задачи и проверка прошла успешно. без синхронизации. )
0
Wladyslaw Java Developer Master
29 мая 2020, 17:48
Кинь код на какой-то пастебин. Буду дома - попробую у себя позапускать
0
Wladyslaw Java Developer Master
29 мая 2020, 21:00решение
Разобрался, мне кажеться.
Гляди, в текущих условиях можно реально не синхронизировать, потому что каждый тред получает уникальный файлнэйм - то есть пишет в мапу по своему уникальному ключу, другим тредам никак это не мешает, они тоже пишут только по своим ключам.
А вот так, по последнему ключу без синхронизации у меня временами получался список длинной в 1 элемент. А это возможно только если в то время как один поток писал в мапу по ключу - другой прочитал. И не увидел то, что предыдущий дописал в лист. С синхронизацией такого исхода у меня не получилось, раз 20 запускал.
Можешь сам попробовать - просто убери синхронизацию при получении листа по ключу из статической мапы.
Так что в рамках этой задачи - действительно можно обойтись без мьютекса
Без синхрона временами выходит так
{0=[3], 1=[6], 2=[9], 3=[15]}
Ну а вообще - это ж многопоточность, тут поди разбери что как.
+2
Денис Стёпшин
31 мая 2020, 00:16
Ага, получается, хоть потоки и обращаются к одному и тому же объекту, тем не менее они пишут в разные пары "ключ/значение", каждый в свою. И получается, что здесь нет никакого общего ресурса - потоки меняют разные данные, а не одно и то же. Вроде осознал, большое спасибо за разъяснение )
Код Ваш запустил у себя и тоже примерно разобрался, что делает, увидел, разницу с synchronized и без. В общем, вопрос исчерпан, благодарю )
Кстати, в коде Вы используете переменные с именем "mock". Как перевести правильно это слово ?) (Любопытство не дает покоя) Я вбил в переводчик - это означает "пародия, насмешка", что вроде как не подходит под контекст задачи и темы )
0
Wladyslaw Java Developer Master
31 мая 2020, 06:15
Что-то типа "заглушки". Тестовые данные, в общем. Общепринятый термин. Хотя буквально это не так переводится, насколько я знаю инглиш.
0
Денис Стёпшин
31 мая 2020, 08:32
Понял, спасибо )
0