sincronización Java basada en un parámetro

Estoy buscando una manera de sincronizar un método basado en el parámetro que recibe, algo como esto:

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

Quiero el metododoSomething para ser sincronizado en base a laname parámetro como este:

Hilo 1: doSomething ("a");

Hilo 2: Hacer algo ("b");

Tema 3: Hacer algo ("c");

Tema 4: Hacer algo ("a");

El subproceso 1, el subproceso 2 y el subproceso 3 ejecutarán el código sin estar sincronizados, pero el subproceso 4 esperará hasta que el subproceso 1 haya terminado el código porque tiene el mismo valor "a".

Gracias

ACTUALIZAR

Basándome en la explicación de Tudor, creo que me enfrento a otro problema: aquí hay una muestra del nuevo código:

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

La razón por la que no relleno el mapa de bloqueos es porque el nombre puede tener cualquier valor.

Según el ejemplo anterior, el problema puede aparecer al agregar / eliminar valores del hashmap mediante varios subprocesos al mismo tiempo, ya que HashMap no es seguro para subprocesos.

Así que mi pregunta es si hago elHashMap a ConcurrentHashMap que es seguro para subprocesos, ¿el bloque sincronizado evitará que otros subprocesos accedan a locks.get (nombre)?

Respuestas a la pregunta(7)

Su respuesta a la pregunta