日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

《Java线程与并发编程实践》—— 2.3 谨防活跃性问题

發布時間:2023/12/4 java 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《Java线程与并发编程实践》—— 2.3 谨防活跃性问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本節書摘來異步社區《Java線程與并發編程實踐》一書中的第2章,第2.3節,作者: 【美】Jeff Friesen,更多章節內容可以訪問云棲社區“異步社區”公眾號查看。

2.3 謹防活躍性問題

活躍性這個詞代表著某件正確的事情最終會發生?;钴S性失敗發生在應用程序觸及一種無法繼續執行的狀態。在單線程的應用程序中,無限循環就是一個例子。多線程應用程序面臨著諸如死鎖、活鎖和餓死的額外挑戰。

死鎖:線程1等待線程2互斥持有的資源,而線程2也在等待線程1互斥持有的資源。兩條線程都無法繼續執行。
活鎖:線程x持續重試一個總是失敗的操作,以致于無法繼續執行。
餓死:線程x一直被(調度器)延遲訪問其賴以執行的資源。或許是調度器先于低優先級的線程執行高優先級的線程,而總是有一個高優先級的線程可以執行。餓死通常也稱為無限延遲。
死鎖會發生在synchronized關鍵字帶來的過多同步上。如果不小心,你可能就會遭遇鎖同時被多條線程競爭的情形;即線程自身缺失繼續執行的鎖,卻持有其他線程需要的鎖,同時由于其他線程持有臨界區的鎖,導致沒有一條線程能夠通過臨界區,進而釋放自己所持有的鎖。清單2-1就是描述該場景的一個典型例子。

清單2-1 一個死鎖的問題

public class DeadlockDemo {private final Object lock1 = new Object();private final Object lock2 = new Object();public void instanceMethod1(){synchronized(lock1){synchronized(lock2){System.out.println("first thread in instanceMethod1");// critical section guarded first by// lock1 and then by lock2} }}public void instanceMethod2(){synchronized(lock2){synchronized(lock1){System.out.println("second thread in instanceMethod2");// critical section guarded first by// lock2 and then by lock1}}}public static void main(String[] args){final DeadlockDemo dld = new DeadlockDemo();Runnable r1 = new Runnable(){@Overridepublic void run(){while(true){dld.instanceMethod1();try{Thread.sleep(50);}catch (InterruptedException ie){}} }};Thread thdA = new Thread(r1);Runnable r2 = new Runnable(){@Overridepublic void run(){while(true){dld.instanceMethod2();try{Thread.sleep(50);}catch (InterruptedException ie){}}}};Thread thdB = new Thread(r2);thdA.start();thdB.start();} }``` 清單2-1中線程A和線程B在不同的時間分別調用了instanceMethod1()和instanceMethod2()方法。參考下面的執行序列:(1)線程A調用instanceMethod1(),獲取到lock1引用對象的鎖,然后進入它外部的臨界區(但是還沒有獲取lock2引用對象的鎖)。(2)線程B調用instanceMethod2(),獲取到lock2引用對象的鎖,然后進入它外部的臨界區(但是還沒有獲取lock1引用對象的鎖)。(3)線程A嘗試去獲取和lock2相關聯的鎖。JVM強制線程在內部臨界區之外等待,由于線程B持有那個鎖。(4)線程B嘗試去獲取和lock1相關聯的鎖。JVM強制線程在內部臨界區之外等待,由于線程A持有那個鎖。(5)由于其他線程持有了必要的鎖,沒有一條線程能繼續執行。遭遇死鎖,程序(至少在這兩條線程的上下文中)就凍結住了。照下面那樣編譯清單2-1:

javac DeadlockDemo.java
運行程序:

java DeadlockDemo`
你應該能在標準輸出流中觀測到交替打印的first thread in instance Method1和second thread in instanceMethod2信息,直到程序因死鎖而凍結。

盡管前面的例子很清晰地識別了死鎖的狀態,但偵測死鎖還是不容易。舉個例子,你的代碼可能在多個類中(在多個源文件里)包含如下的環形關系:

類A的同步方法調用了類B的同步方法。
類B的同步方法調用了類C的同步方法。
類C的同步方法調用了類A的同步方法。
如果線程A調用了類A的同步方法,線程B調用了類C的同步方法,因為線程A還在那個方法當中,當線程B嘗試調用類A的同步方法時,會被阻塞住。線程A會繼續執行直至其調用類C的同步方法,然后阻塞住。死鎖發生了。

注意:
  >Java語言和JVM都沒有提供一種方式來避免死鎖,所以這一任務就落到你的身上。避免死鎖最簡單的方式,就是阻止同步方法或者同步塊調用其他的同步方法和同步塊。盡管這個建議能避免死鎖發生,但還是不現實,因為,在你的某一個同步方法和同步塊中,很可能需要調用Java API中的同步方法,而且這個建議有點因噎廢食,因為被調用的同步方法和同步塊很可能不會調用其他的同步方法和同步塊,從而不會導致死鎖發生。

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的《Java线程与并发编程实践》—— 2.3 谨防活跃性问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 明星双性精跪趴灌满h | 亚洲性视频网站 | 欧美日韩成人 | 国产精品乱码一区二三区小蝌蚪 | 欧美激情在线一区 | 成人va在线观看 | 国产性猛交xxxx免费看久久 | 亚洲色图首页 | 欧美特级黄 | 丰满女人又爽又紧又丰满 | 日韩黄色成人 | 国产精品第72页 | 在线看片 | 69视频免费 | 欧美人妖乱大交 | 一区二区三区久久久久 | 日日日夜夜操 | 亚洲色图10p| 国产精品色在线 | 在线视频自拍 | 在线免费观看av网址 | 国产精品美女久久久 | 国产精品国产自产拍高清av | 国产精品三区四区 | 黑料视频在线观看 | 波多野结衣免费观看视频 | 成人在线不卡视频 | 亚洲av无码一区二区二三区 | 亚洲黄色第一页 | 韩国一区视频 | jizz亚洲女人 | 久操欧美 | 亚洲乱轮| 中文字幕一区二区av | 国产毛片av | 三级国产视频 | 国产精品5区 | 狠狠爱天天干 | 最新在线黄色网址 | 日本123区 | 成人欧美一区二区三区黑人孕妇 | 波多野结衣一区二区三区中文字幕 | 日韩在线导航 | 免费国产91 | 波多野结衣小视频 | 中文字幕乱码人妻无码久久95 | 国产一卡在线 | 成人午夜免费视频 | 日本中文字幕免费 | 亚洲第一色在线 | 手机看片日韩日韩 | 久久久免费精品 | 麻豆小视频 | 国产真实乱 | 激情综合av | 青青青av | 欧美激情黄色 | 成人毛片一区二区三区 | 亚洲影院在线观看 | 精品黑人一区二区三区观看时间 | 欧美日韩国产免费观看 | 久久青 | 99re国产精品 | 日韩av免费在线观看 | 国产第一色 | 久久久久久久偷拍 | 欧美性猛交ⅹ乱大交3 | 欧美成人免费大片 | www.在线观看麻豆 | 久久αv | 久久99精品国产麻豆婷婷洗澡 | 水蜜桃av无码 | 中日韩在线观看视频 | 亚洲美女性生活视频 | 久久夜色网 | 熟妇人妻va精品中文字幕 | 国产日韩精品一区二区三区 | 午夜福利啪啪片 | 伊人69| 亚洲国产视频网站 | 清纯唯美亚洲激情 | 99久久人妻精品免费二区 | 国产色网| 国产成人免费视频 | 91网在线播放| 国产视频精品一区二区三区 | 狠狠操人人干 | 销魂奶水汁系列小说 | 999免费视频 | 影音先锋成人资源网 | 国产一区二区三区视频在线播放 | 欧美精品卡一卡二 | 91调教打屁股xxxx网站 | 精品一区二区三区四区 | 色噜噜网站 | 午夜精品久久久内射近拍高清 | 国产一级片免费看 | 日本成人在线视频网站 | 亚洲97色|