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?