- 相關推薦
Java設計常見問題
導語:Java可以編寫桌面應用程序、Web應用程序、分布式系統和嵌入式系統應用程序等。下面是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 中線程活鎖可能發生在以下情形:
當所有線程在程序中執行 Object.wait (0),參數為 0 的 wait 方法。
程序將發生活鎖直到在相應的對象上有線程調用 Object.notify ()或者 Object.notifyAll ()。
當所有線程卡在無限循環中。
【Java設計常見問題】相關文章:
Java常見問題集錦04-13
Java編程常見問題07-19
Java編程的常見問題05-15
Java編程常見問題匯總06-12
Java工程師面試的常見問題02-10
Java中關于String類型的常見問題03-10
Java初學者的30個常見問題07-30
JAVA的數據權限設計05-28
Java單例設計模式04-25