Udemy Course Multithreading, Concurrency & Performance 15
由前一節最後可知
一般來說我們在一堆的運算過程中,希望保持atomic operation
所以我們要確保同一時間只有only 1的thread進到這個aggregateFunction內!
理想上如下:
而Java針對這個理想有一個keyword:synchronized
或參考以下自己嘗試的code:
上述code執行後會看到:
另外
回到前節的問題
在此複製一樣的code放到不同package內並改寫為以下
再次執行得到:
完整code如下:
更有效率的synchronized關鍵字使用方式是如下
創建lock物件來當作synchronized的鎖
盡量的減小critical section的範圍
這個好處是不用將整個包含Method都變成synchronized
實際運作演練如下
再次執行得到:
如上假設有Thread A進到item++的運算中,由以上寫法
則下一個Thread B至少可以進到increment method內
但是要進到item++運算邏輯則需要排隊等候Thread A跑完
也就是說當increment method內有更多複雜邏輯的時候
只針對critical section部分做lock就好,而不是無腦的將整個method做lock
效率才高!
特別注意-->這裡可將synchronized block稱為Reentrant(可重入)
亦即Thread A已經進入到synchronized method 1
但同時Thread A也還是能進入到synchronized method 2
結論
1.簡單方式就是在Method前加入synchronized
2.或是用Object的方式使用synchronized,但是code會變比較冗長
其他鎖定關鍵邏輯僅供單一Thread進入的還有java5時代有的BlockingQueue