У меня есть набор ресурсов, которые являются экземплярами класса Resource
.В системе выполняются задания, поступающие во время выполнения.Каждое задание требует набора этих ресурсов и должно эксклюзивно использовать все ресурсы, необходимые для его продолжения.То есть, чтобы задание могло быть запущено, оно должно получить блокировки всех ресурсов, которые ему необходимы, и освободить все эти блокировки, которые оно получило, как только оно выполнено.Таким образом, задание не может начать свою обработку, если не доступны все блокировки всех необходимых ему ресурсов.
Ресурсы, необходимые для работы, неизвестны до выполнения.Список ресурсов, необходимый для работы, передается в его конструктор как Collection
ArrayList<Resource>
.
Одним из способов сделать это является то, что в методе run()
каждого потока задания я могу синхронизировать все блокировки ресурсов, в которых нуждается это задание.
synchronized (resource1) {
synchronized (resource2) {
...
}
}
Но это жесткое кодирование, и его невозможно выполнить, поскольку ресурсы, необходимые для работы, известны только во время выполнения.
Другой способ, который я могу придумать, - это поместить ресурсы в структуру коллекции, чтобы при получении блокировки этой коллекции блокировались все записи в этой коллекции, и они никому не были доступны.остальное.
Есть Collections.synchronizedList()
.Однако он блокирует только List
, а не объекты в списке.
Как это можно сделать?
TIA.