java并发编程实践(1)intro
生活随笔
收集整理的這篇文章主要介紹了
java并发编程实践(1)intro
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
【0】README
0.1)本文部分文字描述轉(zhuǎn)自“java并發(fā)編程實(shí)踐”,旨在學(xué)習(xí)“java并發(fā)編程實(shí)踐(1)intro”的相關(guān)知識(shí);
【3】線程帶來(lái)的風(fēng)險(xiǎn) 【3.1】安全性問(wèn)題 1)intro:在沒有充足同步的case下,多個(gè)線程的操作執(zhí)行順序是不可預(yù)測(cè)的; 2)看個(gè)荔枝: public class UnsafeSequence {private int value;public int getNext(){return value++;} } 對(duì)以上代碼的分析(Analysis):上述類的問(wèn)題在于:如果執(zhí)行時(shí)機(jī)不對(duì),那么兩個(gè)線程在調(diào)用 getNext方法時(shí)會(huì)得到相同的值;如下圖所示:
對(duì)上圖的分析(Analysis): A1)雖然遞增運(yùn)算 value++ 看上去是單個(gè)操作,但事實(shí)上它包含3個(gè)獨(dú)立的操作:讀取value,將value加1,并將計(jì)算結(jié)果寫入value;由于運(yùn)行時(shí)可能將多個(gè)線程之間的操作交替執(zhí)行,因此這兩個(gè)線程可能同時(shí)執(zhí)行讀操作,從而使得他們得到相同的值,并都將這個(gè)值加1.結(jié)果就是,在不同線程的調(diào)用中返回了相同的數(shù)值; A2)上面的交替執(zhí)行示意圖給出的是最糟糕的執(zhí)行case:目的是為了說(shuō)明,如果錯(cuò)誤地假設(shè)程序中的操作將按照某種特定順序來(lái)執(zhí)行,那么會(huì)存在各種可能的危險(xiǎn); A3)在UnsafeSequence類中說(shuō)明的是一種常見的并發(fā)安全問(wèn)題,稱為競(jìng)態(tài)條件;因?yàn)樵趧倓偟睦笾χ?#xff0c;getValue()方法是否返回唯一值,要取決于運(yùn)行時(shí)對(duì)線程中操作的交替執(zhí)行方式,這并不是我們希望看到的case;(干貨——引入競(jìng)態(tài)條件)
3)由于多個(gè)線程要共享相同的內(nèi)存地址空間,并且是并發(fā)運(yùn)行,因此它們可能會(huì)訪問(wèn)或修改其他線程正在使用的變量; 4)當(dāng)多個(gè)線程同時(shí)訪問(wèn)和修改相同變量時(shí),將會(huì)在串行編程模型中引入非串行因素,而這種非串行性是很難分析的。要使多線程程序的行為可以預(yù)測(cè),必須對(duì)共享變量的訪問(wèn)操作進(jìn)行協(xié)同,這樣才不會(huì)在線程之間發(fā)生彼此干擾。幸運(yùn)的是,java 提供了各種同步機(jī)制來(lái)協(xié)同這種訪問(wèn);(干貨——引入對(duì)共享變量的協(xié)同訪問(wèn)操作) 看個(gè)荔枝)線程安全的數(shù)值序列生成器 public class SafeSequence {private int value;public synchronized int getNext(){return value++;} }【3.2】活躍性問(wèn)題 1)定義:某件正確的事情最終會(huì)發(fā)生; 2)安全性的含義是:永遠(yuǎn)不發(fā)生最糟糕的事情,而活躍性則關(guān)注與另一個(gè)目標(biāo),即“某件正確的事情最終會(huì)發(fā)生” 3)當(dāng)某個(gè)操作無(wú)法繼續(xù)執(zhí)行下去時(shí),就會(huì)發(fā)生活躍性問(wèn)題。在串行程序中,活躍性問(wèn)題的形式之一是無(wú)意中造成的無(wú)限循環(huán),從而使得循環(huán)之后的代碼無(wú)法得到執(zhí)行。 4)線程將帶來(lái)一些其他活躍性問(wèn)題:如,如果線程A在等待線程B 釋放其特有的資源,而線程B永遠(yuǎn)都不釋放該資源,那么A 就會(huì)永久地等待下去;
【3.3】性能問(wèn)題 1)intro:希望正確的事情盡快發(fā)生,講究的是效率; 2)性能問(wèn)題包括多個(gè)方面:如服務(wù)時(shí)間過(guò)長(zhǎng),響應(yīng)不靈敏,吞吐率過(guò)低,資源消耗過(guò)高,或者可伸縮性較低等; 3)線程總會(huì)帶來(lái)某種程度的運(yùn)行時(shí)開銷:在多線程程序中,當(dāng)線程調(diào)度器臨時(shí)掛起活躍線程并轉(zhuǎn)而運(yùn)行另一個(gè)線程時(shí),就會(huì)頻繁地出現(xiàn)上下文切換操作,這種操作將帶來(lái)極大的開銷,保存和回復(fù)執(zhí)行上下文,丟失局部性,并且CPU 時(shí)間將更多地花在線程調(diào)度而不是線程運(yùn)行上;(干貨——一個(gè)常見的荔枝,當(dāng)跑hadoop的時(shí)候,發(fā)現(xiàn)單節(jié)點(diǎn)比多節(jié)點(diǎn)用的時(shí)間還少,就是這個(gè)原因,因?yàn)椴粩噙M(jìn)行上下文切換,會(huì)帶來(lái)極大的性能開銷)
【3】線程帶來(lái)的風(fēng)險(xiǎn) 【3.1】安全性問(wèn)題 1)intro:在沒有充足同步的case下,多個(gè)線程的操作執(zhí)行順序是不可預(yù)測(cè)的; 2)看個(gè)荔枝: public class UnsafeSequence {private int value;public int getNext(){return value++;} } 對(duì)以上代碼的分析(Analysis):上述類的問(wèn)題在于:如果執(zhí)行時(shí)機(jī)不對(duì),那么兩個(gè)線程在調(diào)用 getNext方法時(shí)會(huì)得到相同的值;如下圖所示:
對(duì)上圖的分析(Analysis): A1)雖然遞增運(yùn)算 value++ 看上去是單個(gè)操作,但事實(shí)上它包含3個(gè)獨(dú)立的操作:讀取value,將value加1,并將計(jì)算結(jié)果寫入value;由于運(yùn)行時(shí)可能將多個(gè)線程之間的操作交替執(zhí)行,因此這兩個(gè)線程可能同時(shí)執(zhí)行讀操作,從而使得他們得到相同的值,并都將這個(gè)值加1.結(jié)果就是,在不同線程的調(diào)用中返回了相同的數(shù)值; A2)上面的交替執(zhí)行示意圖給出的是最糟糕的執(zhí)行case:目的是為了說(shuō)明,如果錯(cuò)誤地假設(shè)程序中的操作將按照某種特定順序來(lái)執(zhí)行,那么會(huì)存在各種可能的危險(xiǎn); A3)在UnsafeSequence類中說(shuō)明的是一種常見的并發(fā)安全問(wèn)題,稱為競(jìng)態(tài)條件;因?yàn)樵趧倓偟睦笾χ?#xff0c;getValue()方法是否返回唯一值,要取決于運(yùn)行時(shí)對(duì)線程中操作的交替執(zhí)行方式,這并不是我們希望看到的case;(干貨——引入競(jìng)態(tài)條件)
3)由于多個(gè)線程要共享相同的內(nèi)存地址空間,并且是并發(fā)運(yùn)行,因此它們可能會(huì)訪問(wèn)或修改其他線程正在使用的變量; 4)當(dāng)多個(gè)線程同時(shí)訪問(wèn)和修改相同變量時(shí),將會(huì)在串行編程模型中引入非串行因素,而這種非串行性是很難分析的。要使多線程程序的行為可以預(yù)測(cè),必須對(duì)共享變量的訪問(wèn)操作進(jìn)行協(xié)同,這樣才不會(huì)在線程之間發(fā)生彼此干擾。幸運(yùn)的是,java 提供了各種同步機(jī)制來(lái)協(xié)同這種訪問(wèn);(干貨——引入對(duì)共享變量的協(xié)同訪問(wèn)操作) 看個(gè)荔枝)線程安全的數(shù)值序列生成器 public class SafeSequence {private int value;public synchronized int getNext(){return value++;} }【3.2】活躍性問(wèn)題 1)定義:某件正確的事情最終會(huì)發(fā)生; 2)安全性的含義是:永遠(yuǎn)不發(fā)生最糟糕的事情,而活躍性則關(guān)注與另一個(gè)目標(biāo),即“某件正確的事情最終會(huì)發(fā)生” 3)當(dāng)某個(gè)操作無(wú)法繼續(xù)執(zhí)行下去時(shí),就會(huì)發(fā)生活躍性問(wèn)題。在串行程序中,活躍性問(wèn)題的形式之一是無(wú)意中造成的無(wú)限循環(huán),從而使得循環(huán)之后的代碼無(wú)法得到執(zhí)行。 4)線程將帶來(lái)一些其他活躍性問(wèn)題:如,如果線程A在等待線程B 釋放其特有的資源,而線程B永遠(yuǎn)都不釋放該資源,那么A 就會(huì)永久地等待下去;
【3.3】性能問(wèn)題 1)intro:希望正確的事情盡快發(fā)生,講究的是效率; 2)性能問(wèn)題包括多個(gè)方面:如服務(wù)時(shí)間過(guò)長(zhǎng),響應(yīng)不靈敏,吞吐率過(guò)低,資源消耗過(guò)高,或者可伸縮性較低等; 3)線程總會(huì)帶來(lái)某種程度的運(yùn)行時(shí)開銷:在多線程程序中,當(dāng)線程調(diào)度器臨時(shí)掛起活躍線程并轉(zhuǎn)而運(yùn)行另一個(gè)線程時(shí),就會(huì)頻繁地出現(xiàn)上下文切換操作,這種操作將帶來(lái)極大的開銷,保存和回復(fù)執(zhí)行上下文,丟失局部性,并且CPU 時(shí)間將更多地花在線程調(diào)度而不是線程運(yùn)行上;(干貨——一個(gè)常見的荔枝,當(dāng)跑hadoop的時(shí)候,發(fā)現(xiàn)單節(jié)點(diǎn)比多節(jié)點(diǎn)用的時(shí)間還少,就是這個(gè)原因,因?yàn)椴粩噙M(jìn)行上下文切換,會(huì)帶來(lái)極大的性能開銷)
總結(jié)
以上是生活随笔為你收集整理的java并发编程实践(1)intro的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 戴尔上架新款游匣 G15 游戏本:i5-
- 下一篇: java并发编程实践(2)线程安全性