2010-08-05 23 views
1

如果我有一個大數組(400000個元素),那麼如果此線程訪問它並且不會將對象長時間釋放給其他線程,則可以使用最高優先級的線程和同步讀取方法 作爲STARVATION低優先級的線程如此餓死?線程匱乏

或飢餓是一個術語,只涉及一個線程無限期地延遲其對象的鎖釋放的情況?

回答

2

飢餓是指Java運行時(JVM)沒有將時間分配給要執行的線程。這可能是由於一種糟糕的調度算法(例如Solaris下的綠色線程,其中1到100萬的for循環執行CPU密集型操作並不會在Solaris下產生CPU,但會在Windows下產生),糟糕的編程習慣applet中的paint()方法)或惡意攻擊(例如,在CPU處於Java進程之外的情況下,攻擊具有拒絕服務攻擊的主機)。

參考鏈接:http://www.jguru.com/faq/view.jsp?EID=47379

0

如果你問,如果飢餓時會發生,因爲具有較高優先級的線程調度器選擇,然後是線程優先級低不能獲得鎖。

+0

幾乎是的,但更確切地說,我想知道如果該鎖被長時間封鎖並且不僅無限期地發生,也會發生飢餓。 – xdevel2000 2010-08-05 07:29:38

1

「Starve」可以有很多含義。在你的情況下,你的線程可能會像其他人注意到的那樣,導致CPU時間分配不足。另外,可以說你的線程已經無法工作了。

如果由於某種原因一個線程正在鎖定資源並且從不釋放資源,則會出現死鎖。還有一個術語叫「線程匱乏死鎖」。在這種情況下,系統會變成死鎖,因爲沒有足夠的線程(更正式地說,如果使用有界線程池來執行相互依賴的任務,就會發生這種情況)。

更一般地說,可能會出現資源匱乏死鎖,如果您只有固定數量的資源併發執行相互依賴的任務,則可能會發生死鎖。

總之,「飢餓」是一個長期過載,並可能意味着很多東西..

0

在你的情況,一個線程持有鎖在處理數據。當該線程持有鎖定時,其他線程無法啓動其工作。 在這種情況下,它不是線程匱乏。其他線程不能開始他們的工作,因爲你的應用程序明確地告訴他們,等到鎖定可用時,這與飢餓無關,而與你的實現無關。