синхронизация Java на основе параметра

Я ищу способ синхронизации метода на основе параметра, который он получает, что-то вроде этого:

public synchronized void doSomething(name){
//some code
}

Я хочу методdoSomething синхронизироваться на основеname параметр как этот:

Поток 1: doSomething ("а");

Поток 2: doSomething ("б");

Поток 3: doSomething ("с");

Поток 4: doSomething ("а");

Поток 1, Поток 2 и Поток 3 выполнят код без синхронизации, но Поток 4 будет ожидать, пока Поток 1 не закончит код, потому что он имеет то же самое «a» значение.

Спасибо

ОБНОВИТЬ

Основываясь на объяснениях Тудора, я думаю, чтоЯ столкнулся с другой проблемой: вот пример нового кода:

private HashMap locks=new HashMap();
public void doSomething(String name){
    locks.put(name,new Object());
    synchronized(locks.get(name)) {
        // ...
    }
    locks.remove(name);
}

Причина, по которой я неЗаполнение карты блокировок происходит потому, что имя может иметь любое значение.

Исходя из приведенного выше примера, проблема может возникать при добавлении / удалении значений из хэш-карты несколькими потоками одновременно, поскольку HashMap не является поточно-ориентированным.

Так что мой вопрос, если я сделаюHashMapConcurrentHashMap Какой потокобезопасен, будет ли синхронизированный блок останавливать доступ других потоков к locks.get (name) ??

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

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