Udemy Course Multithreading, Concurrency & Performance 32
Java 8 CompletableFuture 對比 ES6 Promise
必看的SpringBoot Restful API做non-Blocking範例
前面課程大部分都圍繞在重要的-locks:
- 多數的Multi-Thread程式專注在locks(synchronized,ReentrantLock,ReentrantReadWriteLock…)
- 大部分併發的問題都可以用locks簡單又安全的處理
- Locks有許多軟體與硬體的支援
- 使用locks可以解決幾乎所有的併發問題(ex:Race Condition & Data Races)
- 工程師總要面對交易(問題)
- 學習更多的工具解法才能在不同狀況下有更多選擇
DeadLocks:
- DeadLocks通常無法復原(並需要花時間偵測,及撰寫復原邏輯)
- 常造成應用程式整個停擺
- 應用程式內有越多locks,則越容易產生DeadLocks
Slow Critical Section:
- 多個Thread使用同一個lock
- 其中一個Thread可能會長期重複握著這個lock
- 將造成其餘的Thread運作緩慢
Priority Inversion:
- Low Priority thread(例如背景自動儲存(就像medium自動儲存草稿))
- High Priority thread (例如UI)
- >若Low Priority thread佔據了lock(scheduled out)
- >則High Priority thread則會卡住,直到Low Priority thread scheduled to release thelock
Thread不釋放Lock:
- Thread掛掉,或被interrupted,又或單純忘了release lock
- 將造成其他Thread 永遠hang住!
- 無法復原如同deadlock
- 為了避免,則工程師需要寫更複雜的code(try lock finally區塊timeout等...方式包裹多個critical section)
Performance:
效能問題往往遠超過lock的設計問題
- ThreadA佔據了lock
- ThreadB嘗試拿走lock卻block
- ThreadB則scheduled out(多餘的context switch)
- 當lock釋放後(不論是不是ThreadA釋放),ThreadB則scheduled back(又是一個多餘的context switch)
- 上述這些多餘的潛在因素(多餘的context switch)通常不被注意
- 但是在高速的低毫秒交易系統,這些潛在因素(多餘的context switch)就影響重大!!
Lock相關技術:
- 為什麼需要Lock? ->Multiple Threads 取用shard Resources,應當僅有唯一的Thread可以修改shard Resources!
- 或Non atomic operations
Non-Atomic Operations — Reason:
- 針對單一個shard resource的Non-Atomic Operations
- 例如單一個Java Operation則可分解成單一或多個硬體運算:
如:count++可分解成以下3個硬體命令
- Read count
- 計算新的值
- 儲存新的值到count
(但是過程中可能有其他Thread改變count的值)
Lock Free(i.e.無Lock) Solution — Breakdown:
- 限制Operation確保其為單一個硬體運算
- 單一個硬體運算即:
- 定義上的Atomic
- Thread Safe
快速回顧所有的Atomic命令:
- 讀取/分派原始型別(除了long與double)
- 讀取/分派參考值
- 讀取/分派加了volatile修飾字的long與double
避免Data Races:
- 不透過lock並仍能避免Data Races,最簡單方式就是加上volatile修飾字在原始型別或參考值
關於AtomicX classes:
- 這類Class位於java.util.concurrent.atomic package內
- 這些Unsafe Class提供一些低階的Method做atomic運算
- 如下是Java在該套件下的AtomicX classes
- 這些class提供多樣Atomic Operation
- 利用這些Atomic Operation就能寫出lock-free(i.e.無Lock)邏輯與資料結構
- (後面章節會提到幾個class)