Java 多線程-- 鎖


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 要麼隨機喚醒一個,要麼全部喚醒。


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章