Я думаю, что вы хотите работать с кучей данных параллельно и иметь разные операции блокировки общих блокировок во время их работы.
Вот пример этого: хранить несколько блокировок на карте, которую выпосмотрите на некоторые сопоставления, которые вы черпаете из своих данных (например, данные сотрудников или компании).
import java.util.Collection;
import java.util.HashSet;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class MultipleLocks {
static Map<Operation.Type, Lock> locks = new ConcurrentHashMap<>();
public static void main(String... args) {
Collection<Operation> operations = new HashSet<>();
operations.add(new Operation(Operation.Type.ALPHA, () -> System.out.println(1)));
operations.add(new Operation(Operation.Type.ALPHA, () -> System.out.println(2)));
operations.add(new Operation(Operation.Type.ALPHA, () -> System.out.println(3)));
operations.add(new Operation(Operation.Type.BRAVO, () -> System.out.println(4)));
operations.add(new Operation(Operation.Type.BRAVO, () -> System.out.println(5)));
operations.add(new Operation(Operation.Type.CHARLIE, () -> System.out.println(5)));
operations.parallelStream().forEach(operation -> {
Lock lock = locks.computeIfAbsent(operation.type, type -> new ReentrantLock());
lock.lock();
operation.op.run();
lock.unlock();
});
}
static class Operation {
enum Type {
ALPHA, BRAVO, CHARLIE;
}
Type type;
Runnable op;
Operation(Type alpha, Runnable op) {
type = alpha;
this.op = op;
}
}
}