摘要:參考何去何從的并行計算忘記該死的并行并行程序的復雜性和亂序性,并行程序設計十分復雜。可怕的現實摩爾定律的失效單核上的晶體管數目達到極限。并發級別阻塞重入鎖無饑餓兩個線程優先級不同,低優先級的可能產生饑餓。
Chapter1
參考:
https://github.com/chengbingh...
1.1.1 忘記該死的并行
并行程序的復雜性和亂序性,并行程序設計十分復雜。
linus:并行程序有兩個應用場景
一個是圖形處理領域,比如一個1000萬像素的圖片,用for循環遍歷十分耗時。
一個是服務端編程,比如淘寶雙十一
并行程序的使用的兩個考量:
一個是功能上的,比如jvm 除了main線程還有jit即時編譯,gc垃圾回收線程,業務模型的需要,需要多個執行實體。
一個是性能上,獲得更好的性能。
1.1.2可怕的現實:摩爾定律的失效
單核cpu, 上的晶體管數目達到極限。
1.1.3 柳暗花明:不斷前進
單核cpu===>多核cpu
1.1.4 光明或黑暗
唐納德:摩爾定律的維持由硬件工程師維持,變成軟件工程師來維持。
1.2.1 同步異步
可以理解為,同步,一次方法調用,會等到返回結果了再繼續執行,異步是方法調用后立即返回。
1.2.2 并發&并行
并發的最終效果和并行可能一樣,區別在于,單核cpu,一次只能執行一個指令,只能是并發。
1.2.3臨界區
在并行計算中,臨界區的資源是保護對象,避免
1.2.4阻塞和非阻塞
同步和異步,阻塞和非阻塞區別
1.2.5 死鎖、饑餓、活鎖
死鎖
synchronized 嵌套
lock 不釋放鎖
饑餓
一個線程無法獲取資源,而一直無法執行。(比如線程優先級比較低)
活鎖
兩個線程,都將資源讓給對方,此時,資源在線程間讓來讓去,那么兩個線程都無法執行。
1.3.1 阻塞
synchronized
重入鎖
1.3.2 無饑餓
兩個線程優先級不同,低優先級的可能產生饑餓。
1.3.3無障礙
無障礙是大家都隨意操作資源,一旦發現同時操作某個資源了,那么就回滾。 這個相對于悲觀的阻塞,這個是樂觀策略
1.3.3 無鎖
不斷嘗試修改資源,可能無限循環,直到嘗試修改資源成功
1.3.4 無等待
1.4 并行的兩個定律隨著cpu 個數提高,我們可以不斷提高運行速度,但是還是有限制的。
1.5 java 內存模型(JMM)1.5.1 原子性
原子性指的是一個操作在執行過程中不能被中斷。
中斷的例子:在一個32位的虛擬機中, 每次從內存中操作的大小都是32位的, 現在兩個線程同時給一個64為的long型變量賦值。 一個賦值為1億,一個賦值為2億, 最終賦值的結果可能既不是1億,也不是2億。而是一個莫名其妙的數字。
valiate 關鍵字可以避免這個情況
1.5.2 可見性
一個線程修改了共享變量的值,其它的線程能否立知道這個改變。
cpu優化:
并發情況下, 可能是一個cpu1 修改一個變量后,將它放到緩存cache中,這時另外一cpu2中的線程修改了這個共享變量,它也放到緩存中cache中, 這樣cpu1里的線程由于還是從緩存中取,所以不知道這個修改。
硬件優化
有些內存讀寫會放到一個硬件的隊列中,不會立即操作。
指令重排
1.5.3 有序性
處理器cpu 出現指令重排
常見的Java運行時環境的JIT編譯器也會做指令重排序,即生成的機器指令與字節碼指令順序不一致。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/71271.html
摘要:開始學習也有一段時間了,一些基礎的書也掃了一遍了。最近慢慢開始看和,后者的話和有類似之處,都是一些編程經驗的編程的世界里好多的東西都是相同的。這里其實是對的最佳實踐,之后該對象已經變成一個過期的引用了,此時就應該清空這個引用。 開始學習java也有一段時間了,一些基礎的書也掃了一遍了(think in java/core java volume 1)。最近慢慢開始看和,后者的話和有類似...
摘要:所以需要等來確保程序中隱蔽的錯誤沒有提示的錯誤比如兩個正數相加,溢出導致其值為負數。并發下的兩個線程同時對一個對象,每個線程個對象,最終結果可能中有萬個對象。可能對象個數少于萬可能內部結構發生破壞,程序無法終止,會被大量消耗。 java并行程序基礎 參考:https://github.com/chengbingh... 2.1 有關線程, 需要知道的事 進程是線程的容器線程狀態圖: s...
摘要:因此將變量存放于獨立的緩存行中,也有助于變量在多線程訪問是的性能提升實戰高并發程序設計,大量的高并發庫都會采用這種技術。 在Java程序中,多線程幾乎已經無處不在。與單線程相比,多線程程序的設計和實現略微困難,但通過多線程,我們卻可以獲得多核CPU帶來的性能飛躍,從這個角度說,多線程是一種值得嘗試的技術。那么如何寫出高效的多線程程序呢? 有關多線程的誤區:線程越多,性能越好 不少初學者...
閱讀 2958·2021-11-08 13:20
閱讀 1031·2021-09-22 15:20
閱讀 660·2019-08-30 15:53
閱讀 1964·2019-08-30 15:43
閱讀 1278·2019-08-29 17:21
閱讀 540·2019-08-29 12:15
閱讀 2375·2019-08-28 17:51
閱讀 3142·2019-08-26 13:26