синхронизация Java на основе параметра
Я ищу способ синхронизации метода, основанного на полученном параметре, что-то вроде этого:
public synchronized void doSomething(name){
//some code
}
Я хочу методdoSomething
синхронизироваться на основеname
параметр как этот:
Поток 1: doSomething (& quot; a & quot;);
Поток 2: doSomething (& quot; b & quot;);
Поток 3: doSomething (& quot; c & quot;);
Поток 4: doSomething (& quot; a & quot;);
Поток 1, Поток 2 и Поток 3 выполнят код без синхронизации, но Поток 4 будет ожидать, пока Поток 1 не закончит код, потому что он имеет тот же & quot; a & quot; значение.
Спасибо
UPDATE
Основываясь на объяснениях Тудора, я думаю, что столкнулся с другой проблемой: Вот пример нового кода:
private HashMap locks=new HashMap();
public void doSomething(String name){
locks.put(name,new Object());
synchronized(locks.get(name)) {
// ...
}
locks.remove(name);
}
Причина, по которой я не заполняю карту блокировок, заключается в том, что имя может иметь любое значение.
Исходя из приведенного выше примера, проблема может возникать при добавлении / удалении значений из хэш-карты несколькими потоками одновременно, поскольку HashMap не является поточно-ориентированным.
Так что мой вопрос, если я сделаюHashMap
ConcurrentHashMap
Какой потокобезопасен, будет ли синхронизированный блок останавливать доступ других потоков к locks.get (name) ??