synchronizacja java na podstawie parametru
Szukam sposobu na zsynchronizowanie metody opartej na parametrze, który otrzymuje, coś takiego:
public synchronized void doSomething(name){
//some code
}
Chcę tej metodydoSomething
do synchronizacji na podstawiename
taki parametr:
Wątek 1: doSomething („a”);
Wątek 2: doSomething („b”);
Wątek 3: doSomething ("c");
Wątek 4: doSomething („a”);
Wątek 1, Wątek 2 i Wątek 3 wykonają kod bez synchronizacji, ale wątek 4 będzie czekał, aż wątek 1 zakończy kod, ponieważ ma tę samą wartość „a”.
Dzięki
AKTUALIZACJA
Na podstawie wyjaśnień Tudora myślę, że stoję przed innym problemem: oto przykład nowego kodu:
private HashMap locks=new HashMap();
public void doSomething(String name){
locks.put(name,new Object());
synchronized(locks.get(name)) {
// ...
}
locks.remove(name);
}
Powodem, dla którego nie zapełniam mapy zamków, jest to, że nazwa może mieć dowolną wartość.
Na podstawie powyższego przykładu problem może pojawić się podczas dodawania / usuwania wartości z mapy mieszającej przez wiele wątków w tym samym czasie, ponieważ HashMap nie jest bezpieczny dla wątków.
Więc moje pytanie brzmi, czy zrobię toHashMap
a ConcurrentHashMap
który jest bezpieczny dla wątków, czy zsynchronizowany blok zatrzyma dostęp innych wątków do locks.get (nazwa)?