Есть много инстансов одного класса, который по факту просто служит контейнером для компонентов.
т.е. класс IEntity с методом getComp(...), на котором находятся всякие POJO.
Задача реализовать такой лок, чтобы можно было одновременно получить лок на 2 и более таких объектов...
То есть, например, добавляется класс ILock с методами addEntity(IEntity ent), lock/unlock.
Далее используется так: сначала добавляются объекты, на которые необходимо одномоментно получить лок и вызывается метод lock. При этом, если лок на хотя бы 1 объект уже захватили, то новый лок должен ждать до тех пор, пока его не освободят.
Какие идеи?
Создаёте java.util.concurrent.locks.Lock, передаёте его в конструктор объектов, которые нужно блокировать, в методах объектов осуществляете попытки его захвата.
не-не, методы на компонентах не должны знать о существовании лока, там кстати простые DTO без методов вообще..
По сути сейчас на уровне:
entity.getComp(HpComp.class).value=10;
Просто нужно залочить много таких объектов сразу
Лок не на метод getComp, а лок эксклюзивный на все эти сущности со всеми их компонентами.
Сергей Горностаев, Получается, что все будет в одном потоке, а если второй раз вызывают лок на тех объектах, которые не вошли в первую группу-им должно выдать лок моментально, если нет пересечений объектов, а если есть-должно ждать, пока первый лок завершится
Как обойти дедлоки не ясно тоже
synapse_people, deadlock - это когда два или более мьютекса захватываются потоками в разном порядке, что приводит к взаимоблокировке. Это вообще другая история. Если вам нужно блокировать объекты группами используйте striped lock - создайте несколько экземпляров Lock и блокируйте их по тому же признаку, по которому разбиваете объекты на группы.