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) ??