Насколько мне известно, нет стандартного способа сделать это, и вам придется испачкать руки.
Чтобы перефразировать ваши требования, у вас есть набор структур данных, и вам нужно работать над ними, но не в каком-то определенном порядке. Вы только хотите заблокировать ожидание в структуре данных, если все другие объекты заблокированы. Вот псевдокод, на котором я бы основал свое решение:
work = unshared list of objects that need updating
while work is not empty:
found = false
for each obj in work:
try locking obj
if successful:
remove obj from work
found = true
obj.update()
unlock obj
if !found:
// Everything is locked, so we have to wait
obj = randomly pick an object from work
remove obj from work
lock obj
obj.update()
unlock obj
Обновляющий поток будет блокироваться только в том случае, если обнаружит, что все необходимые ему объекты заблокированы. Затем он должен ждать чего-то, поэтому он просто выбирает один и блокирует его. В идеале, он выберет объект, который будет разблокирован как можно раньше, но не существует простого способа сказать это.
Также возможно, что объект может стать свободным, когда программа обновления находится в цикле try , поэтому программа обновления будет пропускать ее. Но если объем выполняемой вами работы достаточно велик по сравнению с затратами на итерацию по этому циклу, ложный конфликт должен быть редким, и он будет иметь значение только в случаях чрезвычайно высокой конкуренции.