Java-Synchronisation basierend auf einem Parameter

Ich suche nach einer Möglichkeit, eine Methode basierend auf dem empfangenen Parameter zu synchronisieren:

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

Ich möchte die MethodedoSomething basierend auf dem synchronisiert werdenname Parameter wie folgt:

Thread 1: doSomething ("a");

Thread 2: doSomething ("b");

Thread 3: doSomething ("c");

Thread 4: doSomething ("a");

Thread 1, Thread 2 und Thread 3 führen den Code ohne Synchronisierung aus, Thread 4 wartet jedoch, bis Thread 1 den Code beendet hat, da er denselben "a" -Wert hat.

Vielen Dank

AKTUALISIEREN

Basierend auf der Erklärung von Tudor sehe ich mich einem anderen Problem gegenüber: Hier ist ein Beispiel des neuen Codes:

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

Der Grund, warum ich die Sperren-Map nicht auffülle, ist, dass der Name einen beliebigen Wert haben kann.

Basierend auf dem obigen Beispiel kann das Problem auftreten, wenn Werte von mehreren Threads gleichzeitig zur Hashmap hinzugefügt / daraus gelöscht werden, da HashMap nicht threadsicher ist.

Meine Frage ist also, ob ich das macheHashMap a ConcurrentHashMap Welches ist thread-sicher, hält der synchronisierte Block andere Threads davon ab, auf locks.get (name) zuzugreifen?

Antworten auf die Frage(7)

Ihre Antwort auf die Frage