thread method lock intrinsic example java multithreading locking pool

method - lock object java



java.lang.IllegalMonitorStateException:(m=null) Error al obtener el monitor para (3)

¿Por qué puede pasar esto? La cuestión es que el objeto de monitor no es nulo, pero todavía obtenemos esta excepción con bastante frecuencia:

java.lang.IllegalMonitorStateException: (m=null) Failed to get monitor for (tIdx=60) at java.lang.Object.wait(Object.java:474) at ...

El código que provoca esto es una solución de grupo simple:

public Object takeObject() { Object obj = internalTakeObject(); while (obj == null) { try { available.wait(); } catch (InterruptedException e) { throw new RuntimeException(e); } obj = internalTakeObject(); } return obj; } private Object internalTakeObject() { Object obj = null; synchronized (available) { if (available.size() > 0) { obj = available.keySet().iterator().next(); available.remove(obj); synchronized (taken) { taken.put(obj, Boolean.valueOf(true)); } } } return obj; } public void returnObject(Object obj) { synchronized (taken) { taken.remove(obj); } synchronized (available) { if (available.size() < size) { available.put(obj, Boolean.valueOf(true)); available.notify(); } } }

¿Me estoy perdiendo de algo?

EDITAR : La excepción ocurre en available.wait(); línea.


El método takeObject () debe estar sincronizado o, debemos escribir el bloque sincronizado dentro de este método. Espero que consigas una excepción de tiempo de compilación para esto.


Ver el javadoc para Object.wait.

en particular, "El hilo actual debe poseer el monitor de este objeto". y "[arroja] IllegalMonitorStateException - si el hilo actual no es el propietario del monitor del objeto". Es decir, debe sincronizar en el objeto al que va a llamar esperar.

entonces tu código debería ser:

synchronized (available) { available.wait(); }


available.wait(); debe estar en una sección sincronizada (disponible)