java.lang.IllegalMonitorStateException: (m=null) n'a pas réussi à obtenir moniteur pour

Pourquoi cela se produit? Le truc, c'est que le moniteur de l'objet n'est pas nulle, mais encore nous obtenir cette exception assez souvent:

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

Le code qui la provoque, c'est une simple piscine solution:

    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();
            }
        }
    }

Suis-je raté quelque chose?

MODIFIER: L'exception se produit dans available.wait(); ligne.

  • pouvez-vous nous dire quelle est la ligne 474 dans le code source?
  • l'exception se produit dans disponible.wait(); ligne, mais la ligne 474 est de java.lang.La classe d'objet.