синхронизация 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) ??

Ответы на вопрос(7)

Ваш ответ на вопрос