Tengo un proceso A que contiene una tabla en la memoria con un conjunto de registros (recordA, recordB, etc ...)¿Cómo se determina si un objeto está bloqueado (sincronizado) para no bloquearlo en Java?
Ahora, este proceso puede iniciar muchos hilos que afectan los registros, y a veces podemos tener 2 hilos que intentan acceder al mismo registro: esta situación debe denegarse. Específicamente, si un registro está BLOQUEADO por un hilo, quiero que el otro hilo se cierre (no quiero BLOQUEAR ni ESPERAR).
Actualmente hago algo como esto:
synchronized(record)
{
performOperation(record);
}
Pero esto es lo que hizo problemas ... porque mientras Process1 está realizando la operación, si viene en Proceso2 bloquea/espera en el estado sincronizado y cuando Process1 terminado, realiza la operación. En su lugar quiero algo como esto:
if (record is locked)
return;
synchronized(record)
{
performOperation(record);
}
¿Alguna pista sobre cómo se puede lograr esto? Cualquier ayuda sería muy apreciada. Gracias,
Sí. Ese es un buen punto. Tomé el código de ejemplo literalmente, mientras que el anterior es definitivamente una implementación más robusta –
¿Pero cómo uso un bloqueo por registro? Actualmente, los registros se almacenan en una HashTable de registros ... ¿entonces necesito una Hashtable de Locks que coincida? Estoy tratando de asegurar que tenga la mayor simultaneidad posible, así que si un proceso quiere acceder a recordC debería estar bien (si solo está bloqueado el registroB) - Utilizo un BLOQUEO global entonces es esencialmente lo mismo que bloquear todo el hashtable . ... ¿tiene sentido? – Shaitan00
@ Shaitan00: la manera más fácil sería tener un bloqueo dentro del registro. Básicamente, desea un bloqueo asociado a cada registro, así que colóquelo en el objeto. –