當前位置:才華齋>計算機>java語言>

Java設計常見問題

java語言 閱讀(1.26W)

導語:Java可以編寫桌面應用程式、Web應用程式、分散式系統和嵌入式系統應用程式等。下面是Java設計的常見問題,歡迎參考!

Java設計常見問題

  1、什麼時候丟擲InvalidMonitorStateException異常?為什麼?

呼叫 wait ()/notify ()/notifyAll ()中的任何一個方法時,如果當前執行緒沒有獲得該物件的鎖,

那麼就會丟擲 IllegalMonitorStateException 的.異常

也就是說程式在沒有執行物件的任何同步塊或者同步方法時,

仍然嘗試呼叫 wait ()/notify ()/notifyAll ()時。由於該異常是 RuntimeExcpetion 的子類,

所以該異常不一定要捕獲(儘管你可以捕獲只要你願意

作為 RuntimeException,此類異常不會在 wait (),notify (),notifyAll ()的方法簽名提及。

  2、在靜態方法上使用同步時會發生什麼事?

同步靜態方法時會獲取該類的“Class”物件,所以當一個執行緒進入同步的靜態方法中時,

執行緒監視器獲取類本身的物件鎖,其它執行緒不能進入這個類的任何靜態同步方法。

它不像例項方法,因為多個執行緒可以同時訪問不同例項同步例項方法。

  3、當一個同步方法已經執行,執行緒能夠呼叫物件上的非同步例項方法嗎?

可以,一個非同步方法總是可以被呼叫而不會有任何問題。

實際上,Java 沒有為非同步方法做任何檢查,鎖物件僅僅在同步方法或者同步程式碼塊中檢查。

如果一個方法沒有宣告為同步,即使你在使用共享資料Java照樣會呼叫,而不會做檢查是否安全,

所以在這種情況下要特別小心。一個方法是否宣告為同步取決於臨界區訪問(critial section access),

如果方法不訪問臨界區(共享資源或者資料結構)就沒必要宣告為同步的。

  4、在一個物件上兩個執行緒可以呼叫兩個不同的同步例項方法嗎?

不能,因為一個物件已經同步了例項方法,執行緒獲取了物件的物件鎖。

所以只有執行完該方法釋放物件鎖後才能執行其它同步方法。

  5、什麼是執行緒餓死,什麼是活鎖?

執行緒餓死和活鎖雖然不像死鎖一樣是常見的問題,但是對於併發程式設計的設計者來說就像一次邂逅一樣。

當所有執行緒阻塞,或者由於需要的資源無效而不能處理,不存在非阻塞執行緒使資源可用。

JavaAPI 中執行緒活鎖可能發生在以下情形:

當所有執行緒在程式中執行 (0),引數為 0 的 wait 方法。

程式將發生活鎖直到在相應的物件上有執行緒呼叫 fy ()或者 fyAll ()。

當所有執行緒卡在無限迴圈中。