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