Bonjour,

J'ai un problème lié à l'usage des ReentrantReadWriteLock. Pourriez-vous m'aider?

Voici mon problème : voulant protéger l'accès multi-thread à un objet en écriture mais pas en lecture (pour des raisons de performances), j'ai utilisé les ReentrantReadWriteLock de Java. J'ai utilisé une implémentation quasi identique à celle de la doc :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    public Map<String,String> getTranslationDictionary(String language){
        readLock.lock();
        try{
            if (translationCache==null) {
                readLock.unlock();
                writeLock.lock();
                if (translationCache==null) reloadCache();
                readLock.lock();
                writeLock.unlock();
            }
            return translationCache.get(language);
        } finally {
            readLock.unlock();
        }
    }
Lorsque je lance mon application, j'attrape a chaque cette erreur :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
java.lang.IllegalMonitorStateException
    at java.util.concurrent.locks.ReentrantReadWriteLock$Sync.tryReleaseShared(ReentrantReadWriteLock.java:275)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.releaseShared(AbstractQueuedSynchronizer.java:1215)
    at java.util.concurrent.locks.ReentrantReadWriteLock$ReadLock.unlock(ReentrantReadWriteLock.java:576)
    at be.approach.brooklyn.logic.impl.ResourceBundleLogicImpl.getTranslationDictionary(ResourceBundleLogicImpl.java:69)
Auriez-vous une idée de ce qui ne tourne pas rond?

Merci d'avance pour votre aide!