簡體   English   中英

代碼中的IllegalMonitorStateException

[英]IllegalMonitorStateException in code

class Test {

    public static void main(String[] args) {

        System.out.println("1.. ");
        synchronized (args) {

            System.out.println("2..");

            try {
                Thread.currentThread().wait();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            System.out.println("3..");
        }

    }
}

我在此代碼中收到IllegalMonitorStateException監視器異常。 據我了解,由於圍繞字符串數組對象args的同步塊,當前線程必須已獲得該鎖,並且使用wait方法,我將釋放該鎖。

有人可以向我解釋此異常的原因嗎?

您正在Thread.currentThread()上調用wait() Thread.currentThread() 在任何對象上調用wait()之前,您必須通過此對象上同步塊的同步方式擁有該對象的監視器。 所以缺少的是

synchronized(Thread.currentThread()) {
    Thread.currentThread().wait();
}

也就是說,在Thread對象上調用wait()並不是您應該做的事情,並且可能表明您不了解wait()作用,尤其是考慮到您沒有其他任何調用notify()notifyAll() 在傳遞給main方法的參數上進行同步也是一個很奇怪的選擇。 wait()是一種非常低級的方法,即使您完全了解它的作用,也應很少使用。 為了獲得更好的答案,您應該解釋一下您實際希望此代碼執行的操作。

來自IllegalMonitorStateException 文檔

拋出該異常指示線程試圖在對象的監視器上等待或通知其他線程在對象監視器上等待而沒有擁有指定的監視器

Object#notify() 文檔

線程通過以下三種方式之一成為對象監視器的所有者:

  • 通過執行該對象的同步實例方法。
  • 通過執行在對象上同步的同步語句的主體
  • 對於類類型的對象,通過執行該類的同步靜態方法。

因此,由於線程正在對args對象執行塊同步

synchronized (args) {
    //...
}

您應該調用args.wait()而不是Thread.currentThread().wait();

嗨,我想我想您正在嘗試學習多線程的一些基本概念。 嘗試掌握一些好的在線教程: http : //www.javaworld.com/jw-04-1996/jw-04-threads.html

或嘗試一些基本的好書。 http://www.amazon.com/SCJP-Certified-Programmer-Java-310-065/dp/0071591060/

您編寫的程序實際上不需要同步,因為只有一個線程(主線程)。 我知道您只是在嘗試,因此提供了一些見解。 即使您在args(args.wait())上正確調用了wait方法或在Thread.currentThread上進行了同步,您的線程也可能進入不確定的等待狀態(使程序無響應),因為沒有其他線程可以通知您的主線程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM