Есть три класса: A, B, С.
В классе B есть ArrayList и определены Getter и Setter.
Класс A каждую минуту добавляет через setter элементы в список.
Класс С каждые две минуты получает через getter элементы списка и очищает список.
Вопрос: как синхронизировать список в классе B, чтобы классы друг-другу не мешали и в случае если они встретились, то один уступил другому?
Решает ли проблему установка syncronized на getter и setter? Или надо синхронизировать что-то другое?
Daniil Shadrin
27 уровень
Как синхронизировать данные с класса?
Решен
Комментарии (13)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Ksenia VolkovaJava Developer в DXCMaster
2 ноября 2020, 15:58
Немного оффтоп, но для добавления элемента в список сеттер не нужен.
0
Daniil Shadrin
2 ноября 2020, 16:15
А как по другому добавить элемент из другого класса в приватный список?
0
hidden #2322530
2 ноября 2020, 16:27
сделал один метод, который получает ссылку на данный список.
в другом классе делаешь поле/переменную, куда в конструкторе например сразу кладётся ссылка на этот список. и дальше ты работаешь уже через внутреннюю переменную напрямую, как будто это ArrayList создан внутри класса А
0
hidden #2322530
2 ноября 2020, 15:52решение
в принципе да. если например у тебя будет метод getter, а внутри него будет блок synchronized (ArrayList), тогда при его вызове будет блокировать поле для доступа. и метод setter будет зависать на блоке synchronized до момента освобождения мьютекса этого поля
как вариант ещё можно использовать wait / notify , lock / unlock
для исключения шанса получить исключение по Concurrent, тут лучше использовать CopyOnWriteArrayList
можно использовать очереди . это уже из варианта producer-consumer (как описал ниже коллега) и там не будет ArrayList. и это больше подходит для твоего случая.
+2
Daniil Shadrin
2 ноября 2020, 15:58
А если синхронизировать по самому методу? Т.е synchronized getArray() / syncronized setArray().
0
hidden #2322530
2 ноября 2020, 15:59
это равноценно будет synchronized (this) , то есть блокировка по объекту в целом.
0
Daniil Shadrin
2 ноября 2020, 16:05
Получается что будет блокировка по самому геттеру, вместо блокировки по листу?
Но при этом лист отсанется не заблокированным?
0
hidden #2322530
2 ноября 2020, 16:08
в этом случае любой метод synchronized в этом классе не отработает для этого объекта. ибо у тебя весь объект будет считаться заблокированным.
0
Daniil Shadrin
2 ноября 2020, 16:13
Получается что мьютекс будет на методе и объекте внутри метода? И другой метод с вызовом этого же объекта будет ждать когда освободится объект?
0
hidden #2322530
2 ноября 2020, 16:24
synchronized (объект) захватывает мьютекс объекта.
если у нескольких методов/блоков кода идёт синхронизация по этому (объект), то все эти методы будут зависать до тех пор, пока мьютекс объекта не освободится.
так вот
будет равен
а так как тебе нужно обеспечить доступ только к одному полю, то по нему и надо делать синхронизацию.
запомни одну вещь. захват мьютекса, это не блокировка самого объекта, это всего лишь дверь, через которую будут пытаться работать твои методы (и все методы пускать через одну дверь, это как сделать туалет в институте на 10 кабинок, но каждый кто войдёт в него, будет закрывать входную дверь в туалет на ключ, и 9 кабинок будут пустовать всегда)
многопоточность вообще очень непростая тема, лучше почитать и посмотреть видео по этой теме. заодно немного каша в голове утрамбуется, и знания разложатся по полочкам немного.
0
Daniil Shadrin
2 ноября 2020, 16:37
Всё понятно. Спасибо
0
Wladyslaw Java Developer Master
2 ноября 2020, 15:51
Как первый генерирует элементы, как второй их забирает, равномерно по одному в заданный промежуток времени или нет?
Ограничен ли размер списка, если нет - нет ли вероятности упасть с OutOfMemmoryError?
Это чтото типа producer-consumer, можешь посмотреть вот тут. Низкоуровневая реализация с ручным управлением перехода потоков в/из wait setа монитора. Можно глянуть в сторону java.util.concurren
Можешь ещё на Ютубе найти канал golovach courses и поискать по плейлиста лекции по многопоточке. В одной из них они как раз писали что-то подобное как по первой ссылке. Да и вообще он довольно доходчиво объясняет многопоточку
+1
Daniil Shadrin
2 ноября 2020, 15:57
Спасибо, почитаю.
0