當前位置:才華齋>計算機>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 ()。

當所有線程卡在無限循環中。