標籤:
IMSE_DONT_CATCH_IMSE
java.lang Class IllegalMonitorStateExceptionjava.lang.Object java.lang.Throwable java.lang.Exception java.lang.RuntimeException java.lang.IllegalMonitorStateExceptionAll Implemented Interfaces:Serializablepublic class IllegalMonitorStateExceptionextends RuntimeExceptionThrown to indicate that a thread has attempted to wait on an object‘s monitor or to notify other threads waiting on an object‘s monitor without owning the specified monitor.
這個問題大抵是因為給沒有鎖的對象使用了諸如notify(),wait()等方法,所以拋出java.lang.IllegalMonitorStateException。
給實際上加鎖的對象進行操作就可以了。
例如:
public class ThreadTest { public static void main(String[] args) { new Thread(new ThreadDemo()).start(); }}class ThreadDemo implements Runnable { private int i = 0; public synchronized void run() { try { ThreadTest.class.wait(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + ":" + i); }}
妥妥地
Exception in thread "Thread-0" java.lang.IllegalMonitorStateException at java.lang.Object.wait(Native Method) at java.lang.Object.wait(Object.java:503) at com.github.alaahong.ThreadDemo.run(ThreadTest.java:14) at java.lang.Thread.run(Unknown Source)
只需將其中的
ThreadTest.class.wait();
改成
this.wait();
即可。
Ref:1 2 3 4
從FindBugs中學Java【二】