JAVA中如何确保N个线程可以访问N个资源,但同时又不导致死锁?
● JAVA中如何確保N個(gè)線程可以訪問(wèn)N個(gè)資源,但同時(shí)又不導(dǎo)致死鎖??
考察點(diǎn):死鎖
參考回答:
使用多線程的時(shí)候,一種非常簡(jiǎn)單的避免死鎖的方式就是:指定獲取鎖的順序,并強(qiáng)制線程按照指定的順序獲取鎖。因此,如果所有的線程都是以同樣的順序加鎖和釋放鎖,就不會(huì)出現(xiàn)死鎖了。
預(yù)防死鎖,預(yù)先破壞產(chǎn)生死鎖的四個(gè)條件。互斥不可能破壞,所以有如下三種方法:
1.破壞請(qǐng)求和保持條件,進(jìn)程必須等所有要請(qǐng)求的資源都空閑時(shí)才能申請(qǐng)資源,這種方法會(huì)使資源浪費(fèi)嚴(yán)重(有些資源可能僅在運(yùn)行初期或結(jié)束時(shí)才使用,甚至根本不使用). 允許進(jìn)程獲取初期所需資源后,便開(kāi)始運(yùn)行,運(yùn)行過(guò)程中再逐步釋放自己占有的資源,比如有一個(gè)進(jìn)程的任務(wù)是把數(shù)據(jù)復(fù)制到磁盤(pán)中再打印,前期只需獲得磁盤(pán)資源而不需要獲得打印機(jī)資源,待復(fù)制完畢后再釋放掉磁盤(pán)資源。這種方法比第一種方法好,會(huì)使資源利用率上升。
2.破壞不可搶占條件,這種方法代價(jià)大,實(shí)現(xiàn)復(fù)雜。
3.破壞循壞等待條件,對(duì)各進(jìn)程請(qǐng)求資源的順序做一個(gè)規(guī)定,避免相互等待。這種方法對(duì)資源的利用率比前兩種都高,但是前期要為設(shè)備指定序號(hào),新設(shè)備加入會(huì)有一個(gè)問(wèn)題,其次對(duì)用戶編程也有限制。
總結(jié)
以上是生活随笔為你收集整理的JAVA中如何确保N个线程可以访问N个资源,但同时又不导致死锁?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: synchronized与java.ut
- 下一篇: 锁和同步的区别