同步與異步:本質區別
| 維度 | 同步 | 異步 |
| 調用模式 | 阻塞等待結果 | 委托回調/未來,繼續執行 |
| 線程視角 | 單線程串行 | 多線程並行 |
| 生活類比 | 吃飯再說話 (一張嘴) | 吃飯聽音樂 (互不干擾) |
| Java 關鍵字 | synchronized, Lock | CompletableFuture, 回調, 事件循環 |
代碼層同步:synchronized 與 Lock
-- MySQL InnoDB
SELECT * FROM account WHERE id = 1 FOR UPDATE; -- 排他鎖 (X Lock)
-- 業務邏輯處理
UPDATE account SET balance = balance - 100 WHERE id = 1;
COMMIT; -- 釋放鎖
- 共享鎖 (S Lock / LOCK IN SHARE MODE): 可讀不可寫,兼容 S 鎖,排斥 X 鎖。
- 排他鎖 (X Lock / FOR UPDATE): 可讀可寫,排斥 S/X 鎖。
- 適用: 衝突頻率高、臨界區邏輯複雜、無法容忍重試。
- 缺點: 併發度低、易死鎖、長事務阻塞連接池。
樂觀鎖:假定衝突罕見,改後驗證
- 實現方式: 版本號、時間戳、全字段對比 (Hibernate
@Version 默認版本號)。
- 適用: 讀多寫少、衝突率低、業務可重試 (如電商扣庫存)。
- 缺點: ABA 問題 (需引入 CAS 或時間戳)、重試邏輯複雜、長事務不適用。
Java 中的樂觀鎖實踐
0) return;
// 短暫退避
Thread.sleep(new Random().nextInt(10));
}
throw new OptimisticLockException("重試 " + maxRetry + " 次仍失敗");
}
鎖選型決策樹