小编nig*_*ser的帖子

在Android上解锁ReentrantLock时发生IllegalMonitorStateException

我正在使用ReentrantLock及其推荐的做法(锁定,然后将实际代码放入try-block中,然后最后进行解锁,请参见下面的代码示例)。有时(非常罕见)我在解锁期间遇到java.lang.IllegalMonitorStateException异常。为什么会发生?也许它与Android的Java VM实现有关。

错误:

java.lang.IllegalMonitorStateException
java.lang.IllegalMonitorStateException
at java.util.concurrent.locks.ReentrantLock$Sync.tryRelease(ReentrantLock.java:126)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.release(AbstractQueuedSynchronizer.java:1232)
at java.util.concurrent.locks.ReentrantLock.unlock(ReentrantLock.java:430)
at com.example.dummy.backend.model.Model.unlock(Model.java:283)
at com.example.dummy.backend.engine.Engine.removeOldInstances(Engine.java:712)
at com.example.dummy.backend.engine.Engine$ProcessOnResumeWorkInBackground.doInBackground(Engine.java:836)
at com.example.dummy.backend.engine.Engine$ProcessOnResumeWorkInBackground.doInBackground(Engine.java:790)
at android.os.AsyncTask$2.call(AsyncTask.java:185)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
at java.lang.Thread.run(Thread.java:1019)
Run Code Online (Sandbox Code Playgroud)

代码示例(略有简化):

myLock.lock();
try {
        LinkedList<MyClass> myClassInstances = model.getMyClassInstances();
        Iterator<MyClass> iterator = myClassInstances.iterator();
        while (iterator.hasNext()) {
                MyClass myClassInstance = iterator.next();
                boolean toBeRemoved = true; // simple condition here
                if (toBeRemoved) {
                        logger.info("Removing old myClassInstance " + myClassInstance.getTimestamp());
                        iterator.remove();
                        Cache.removeMyClassByCodeAndTimestamp(myClassInstance);
                }
        }
} finally {
        myLock.unlock();
}
Run Code Online (Sandbox Code Playgroud)

java android synchronization reentrantlock

5
推荐指数
0
解决办法
733
查看次数

Emacs:Python的完整基类方法

是否可以制作其中一种jedi.elanaconda-mode完整的基类方法?例如,当子类化时,html.parser.HTMLParser我希望它在点完成以下代码(1)(基类有类似handle_data或的方法handle_starttag):

import html.parser
class MyParser(html.parser.HTMLParser):
    def handle_  # (1)
Run Code Online (Sandbox Code Playgroud)

python emacs emacs-jedi

5
推荐指数
1
解决办法
195
查看次数