一
CAS ( 比較並交換 ) compare-And-Swap shi CPU 原子指令,彙編指令 不會造成數據不一致 :自旋鎖 ,Unsafe
AtomicInteger :
CAS缺點:保證一致性,但需要多次比較 ;循環時間長,開銷大。只能保證一個變量的原子操作,。同時引出ABA問題,
二. volitile 避免指令重排,同步更新數據,應用於單例模式
三 .java 資源共享
1.成員變量如果是非靜態的 在多線程的環境下 都會爲每個線程拷貝一個副本,各個線程維護獨立的副本互不影響。
2.對共享資源寫操作時會存在不安全的情況,如果只是讀數據則沒有影響。
3..join 是對象的方法 ,當前主線程被阻塞,當前線程插隊
四. 鎖
1. 偏向鎖 ,自旋鎖 ,輕量鎖,重量鎖
偏向鎖:代碼中不可能出現所線程併發爭搶同一個鎖的時候,
2 自旋鎖: 嘗試獲取鎖的線程不會立即阻塞,而是採用循環的方式嘗試獲取鎖,好處是減少線程上下文切換,缺點是消耗CPU
3公平鎖:按照順序
非公平鎖:不按順序,後申請的線程有可能比先申請的線程優先獲得鎖,在高併發情況下
4 。 可重入鎖( 又叫遞歸鎖 ):同一線程外層函數獲得鎖後,內層遞歸函數仍然能獲取該鎖的代碼。同一個線程在外層獲取鎖的時候,在進入內層方法會自動獲取鎖。即線程可以進入任何一個它已經擁有的鎖或者同步着的代碼塊。
5.讀寫鎖:ReentrantReadWriteLock
五。 阻塞隊列
1.爲什麼要用
不再需要關心什麼時候阻塞線程,什麼時候喚醒線程。
2.阻塞架構:
3.各個隊列
SynchronousQueue: 只存放一個元素的隊列。
。升級
synchronized ——> lock
Wait ——> await
Notify ——> Singal
六.synchronize 與 Lock區別 ,Lock的優勢
A。synchronize 是JVM的關鍵字, 底層是monitorenter ,通過monitor對象來實現,wait和notify等方法也依賴於monito對象,只有在同步塊方法中才能調wait、notify等方法。
Monitorexit 。可重入鎖, 底層有個計數器 ,有正常退出和異常退出。
B。 synchronized 不需要手動釋放鎖 。
C。不可中斷 ,除非異常
D .非公平鎖關鍵字
F. 沒有condition 的
2.Lock 是API層面的,Concurent.Lock
需要手動操作鎖
B。ReentrantLock可以中斷。2 可以設置超時方法tryLock( timeout , TimeUnit )
可以lockInterruptibly() 放代碼塊中,調用interrupt () 方法可中斷。
C。默認是非公平鎖 ,默認的構造是false ,
D.ReentrantLock 用來實現分組喚醒需要喚醒的線程,可以精確喚醒,而不是像synchronize 要麼隨機喚醒一個,要麼全部喚醒。