《Java并發編程實踐》總結

這學期開始我準備重新夯實一下Java基礎,那么首當其沖的就是并發編程和Java虛擬機了,于是我在一個月的時間里終于把《Java并發編程實踐總結》啃下來了,真的是啃,因為這本書對于沒有多少并發編程經驗的我來說實在晦澀難懂,以前做Android的時候網絡編程還略微用過一點,現在學Java Web,Spring和Servlet都已經把多線程封裝好了,沒有什么機會用到,但是了解多線程的設計思想及其底層設計還是很重要的。

競態條件

當某個計算的正確性取決于多個線程的交替執行時序時,就會發生競態條件 。

競態條件是并發編程出現問題的一大主因,“先檢查后執行”操作就是競態條件的最常見的類型,就是根據一個可能失效的結果來決定怎么進行下一步計算。

//競態條件偽代碼
if(一個可能為真可能為假的條件)
    操作A

在多線程環境下,在你確定條件為真并在操作A執行前,另一個線程又將條件置為假,這將此代碼置于一種不穩定的狀態,即有可能是對的也有可能是錯的,全靠運氣。

可重入

如果某個線程試圖獲得一個已經由它自己持有的鎖,如果成功,則這個鎖是可重入的,否則是不可重入的

重入鎖的設計思想是每個鎖關聯一個計數值和一個線程。計數值為0,則沒有任何線程持有該鎖。若線程試圖獲取該鎖而該鎖計數值不為0時,則判斷該線程是否是已經持有本鎖的線程,如果是則獲取成功,計數值+1。否則獲取失敗。線程每一次退出同步區時,計數值-1,當計數值為0時,該鎖被釋放。

內置鎖不是可重入的,ReentrantLock則可以重入。

重排序

在編譯器中生成的指令順序,可以與源代碼中的順序不同

第一次看到重排序時,我就在想JVM這不是在亂搞嗎,我辛辛苦苦寫的代碼,你還來給我重排序。后來了解到重排序提升了編譯效率,但是重排序機制也不是對所有代碼都重排序,操作A和操作B之間如果滿足了偏序關系,即“Happens-Before”關系,那么JVM就不會對它們的代碼進行重排序。

Volatile關鍵字

把變量聲明為Volatile后,編譯器會注意到這個變量是共享的,因此不會把該變量上的操作與其他內存操作一起重排序,例如在多線程中需要設置一個變量為循環條件時,最好將其設為volatile

volatile boolean asleep;
...
while(!asleep)
{
  .....
}

同步工具類

a.CountDownLatch

CountDownLatch稱之為閉鎖,可以使一個或多個線程等待一組事件的發生。CountDownLatch主要有兩個方法,countDown()和await(),沒調用一次countdown則計數值減一,await將一直阻塞直到計數值為0。

b.FutureTask

FutureTask表示的計算是通過Callable來實現的,相當于一種可生成結果的Runnable,并且可以處于以下三種狀態:等待運行,正在運行,運行完成。FutureTask.get方法調用后如果該任務已經完成,則立即返回結果,否則一直阻塞到任務完成或者拋出異常。

無限制創建線程的不足

  • 線程生命周期的開銷非常高。
  • 資源消耗
  • 穩定性因素,可能拋出OutOfMemoryError錯誤。

Executor

由于無限制創建線程并不是一種好的策略,于是我們可以使用有界隊列來防止這一情況的產生,Executor就應運而生了。

Executor基于生產者消費者模式,如果要在程序中實現一個生產者消費者模式,最簡單的方法就是使用Executor。

線程池

線程池可以復用多個線程從而分攤線程創建和銷毀過程中的巨大開銷,由于任務到來時線程已經存在了從而還提高了響應性,可以調用Executors中的幾個靜態方法來創建一個線程池。

  • newCachedThreadPool()

    線程池的規模無限制,線程超過需求就創建,小于需求就回收

  • newFixedThreadPool(int)

    線程池的規模是固定的

  • newScheduledThreadPool(int)

    固定長度的線程池,以延時或定時的方式執行任務

  • SingleThreadExecutor()

    只包含一個線程的線程池

飽和策略

前面說了線程池使用有界隊列來管理線程,如果飽和了怎么辦呢?就需要用到提前定義的飽和策略:

  • AbortPolicy: 直接拋出異常,由調用者自己捕獲編寫處理代碼。
  • DiscardPolicy: 不處理該任務,直接丟棄
  • DiscardOldestPolicy: 丟棄隊列里最近的一個任務,并執行當前任務。
  • CallerRunsPolicy: 只用調用者所在線程來運行任務。

顯式鎖

Lock和ReentrantLock

Lock和ReentrantLock與內置鎖的區別是可以中斷一個正在等待獲取鎖的線程,或者使該線程無限地等待下去,Lock和ReentrantLock必須在finally代碼塊中釋放鎖,否則一直持有鎖就極易形成死鎖

讀寫鎖

讀寫鎖其實是由兩個Lock組成的

public interface ReadWriteLock
{
  Lock readLock();
  Lock writeLock();
}

在讀寫鎖的加鎖策略中,允許多個讀操作同時進行,但每次只允許一個寫操作。

以上就是我讀第一遍的部分收獲,此書太過經典,第一遍我大概只掌握了40%的知識,等以后有時間了再二刷。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,619評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,155評論 3 425
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,635評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,539評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,255評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,646評論 1 326
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,655評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,838評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,399評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,146評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,338評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,893評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,565評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,983評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,257評論 1 292
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,059評論 3 397
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,296評論 2 376

推薦閱讀更多精彩內容

  • layout: posttitle: 《Java并發編程的藝術》筆記categories: Javaexcerpt...
    xiaogmail閱讀 5,852評論 1 19
  • 第1章 并發編程的挑戰 1.1 上下文切換 即便是單核CPU也支持多線程并發,CPU通過給每個線程分配時間片(幾十...
    卑鄙的鹿尤菌閱讀 4,802評論 1 22
  • 上周的面試中,被問及了幾個并發開發的問題,自己回答的都不是很系統和全面,可以說是“頭皮發麻”,哈哈。因此果斷購入《...
    想象美閱讀 538評論 1 4
  • 最近,大家被這部劇耍爆了吧... 里面顏王孫紅雷除了時常神兜兜發傻以外,最出彩的就是化身米其林三星大廚,秀各種廚藝...
    61c64b8b9616閱讀 436評論 0 0
  • 雨后。麥苗瘋長 朝著天空的方向,熙熙攘攘 河流孤獨的流向遠方,水流無聲 穿行在這岸邊的麥田 沒有一匹馬或者蝴蝶陪伴...
    穗心說語閱讀 547評論 0 3