sincronização de java baseada em um parâmetro

Eu estou procurando uma maneira de sincronizar um método com base no parâmetro que recebe, algo assim:

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

Eu quero o métododoSomething para ser sincronizado com base noname parâmetro como este:

Tópico 1: doSomething ("a");

Tópico 2: doSomething ("b");

Tópico 3: doSomething ("c");

Tópico 4: doSomething ("a");

Thread 1, Thread 2 e Thread 3 executarão o código sem serem sincronizados, mas o Thread 4 aguardará até que o Thread 1 tenha terminado o código porque ele possui o mesmo valor "a".

obrigado

ATUALIZAR

Com base na explicação do Tudor, acho que estou enfrentando outro problema: aqui está uma amostra do novo código:

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

O motivo pelo qual não preencho o mapa de bloqueios é porque o nome pode ter qualquer valor.

Com base no exemplo acima, o problema pode aparecer ao adicionar / excluir valores do mapa de hash por vários encadeamentos ao mesmo tempo, uma vez que o HashMap não é thread-safe.

Então minha pergunta é se eu fizer oHashMap a ConcurrentHashMap que é thread safe, o bloco sincronizado irá parar outros threads de acessar locks.get (name) ??

questionAnswers(7)

yourAnswerToTheQuestion