AtomicInteger
- ABA:狸貓換太子
- 解決:理解院子引用+新增機制(版本號,類似時間戳)
鎖
- 公平鎖和非公平鎖 - 併發包中的 ReentrantLock
- 指定構造函數的boolean獲得,默認非公平鎖
- 公平:多線程按申請所得順序獲取鎖,先來後到
- 非公平:多線程獲取所得順序不按照申請順序,可能後申請的線程比先申請的線程遊戲拿貨去鎖,如果嘗試失敗,再採用公平鎖方式。高併發時,可能造成優先級翻轉或飢餓線象。吞吐量比公平鎖大。
- synchronized 是非公平鎖
- 可重入鎖(遞歸鎖)
code interview.thread.ReentrantLockDemo
1. 概念:同一線程外層函數獲得鎖之後,內層遞歸函數仍然能獲取該所的代碼。同一線程在外層方法獲取鎖後,進入內層方會自動獲取鎖。即,線程可進入任何一個他已經擁有的鎖所同步者的代碼塊。
2. ReentrantLock/Synchronized 是可重入鎖
3. 作用:避免死鎖
- 自旋鎖
code interview.thread.SpinLockDemo
1. 基於:unsafe類 + CAS(compare and set)
2. 概念:嘗試獲取鎖的線程不會阻塞,採用循環方式獲取鎖,好處是減少線程上下文切換的消耗,缺點是循環會消耗CPU
- etc
code interview.thread.ReadWriteLockDemo
1. 獨佔鎖:該鎖一次只能被一個線程持有。ReentrantLock、Synchronized都是獨佔鎖。
2. 共享鎖:該鎖可被鎖個線程持有。
3. ReentrantReadWriteLock:讀是共享鎖,寫是獨佔鎖。該鎖的共享鎖保證併發讀是高效的,讀讀可共存,讀寫、寫讀、寫寫過程互斥。