Udemy Course Multithreading, Concurrency & Performance 32

一些補充知識與課程回顧

ZONGRU Li
Sep 29, 2021

Java多執行緒基礎知識

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個硬體命令

  1. Read count
  2. 計算新的值
  3. 儲存新的值到count

(但是過程中可能有其他Thread改變count的值)

Lock Free(i.e.無Lock) Solution — Breakdown:

  • 限制Operation確保其為單一個硬體運算
  • 單一個硬體運算即:
  1. 定義上的Atomic
  2. 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
我是java8看的,其他版本可能不同
  • 這些class提供多樣Atomic Operation
  • 利用這些Atomic Operation就能寫出lock-free(i.e.無Lock)邏輯與資料結構
  • (後面章節會提到幾個class)

參考課程

--

--

ZONGRU Li
ZONGRU Li

Written by ZONGRU Li

2022/11/17 開源部分個人筆記給LINE "Java程式語言討論區"社群,希望能對社群的技術學習做一點點貢獻.(掩面....記得退訂閱!

No responses yet