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