java鎖機制

鎖實現互斥同步java

同步是指多個線程併發訪問共享數據時,保證同一時刻只有一個線程使用spring

 

java中,最近簡單互斥鎖實現使用synchronized關鍵字安全

synchronized關鍵字進過編譯後,會在代碼塊先後生成一個monitor enter指令併發

以及多個monitor exit。保證異常狀況下,能正常退出方法塊mvc

 

同時java中的ReentrantLock類也提供了同步功能,可是他同時還提供了不少高級功能例如:jvm

等待可中斷,可實現公平鎖,以及鎖綁定多個條件,鎖過時高併發

 

公平鎖:按照申請鎖的時間順序依次獲取鎖性能

synchronzied:非公平鎖  ReentrantLock:默認非公平鎖,可配置公平鎖操作系統

 

建議:jdk1.6之後優先考慮使用synchronzied實現互斥同步線程

 

非阻塞同步

互斥同步會進行線程阻塞和喚醒,同時帶來性能問題,被稱爲阻塞同步(悲觀併發策略)

數據共享產生爭用,產生衝突,採起補償措施,不把線程掛起,被稱爲非阻塞同步(樂觀併發策略)

非阻塞同步實現CAS,CAS指令執行時,只有內存地址值等於舊預期值時,處理纔會將內存地址值更新

缺點:會出現ABA問題,java提供了AtomicStampedReference經過版本控制變量值,來保證CAS的正確性。

若是出現ABA問題,傳統互斥鎖性能可能比原子類性能更好

 

無同步方案

ThreadLocal:線程本地存儲,保證變量的可見性,再同一個線程中,是一種無鎖化實現。

使用場景:springmvc中單例模式下,保證高併發線程安全。

 

重量級鎖

重量級鎖會阻塞加鎖失敗的線程,在目標鎖被釋放後,從新喚醒進程

java線程的阻塞和喚醒,是由操做系統來完成的,涉及用戶態與內核態切換,開銷很是大

爲了不昂貴的阻塞和喚醒,java引入自適應自旋,其實實質在處理器中空跑一段時間,等待鎖釋放

 

輕量級鎖

輕量級鎖,jdk1.6引入經過CAS操做,當前比較對象鎖字段的值是否爲當前鎖記錄的地址,若是成功該線程獲取到對象。

CAS不成功,檢查鎖對象是否指向當前的棧幀

若是是jvm會清除鎖,進入該同步塊,不然證實鎖被其餘線程持有,超過2個爭用該鎖會被膨脹爲重量級鎖

 

偏向鎖

偏向鎖是在在無競爭狀況下,去除同步和CAS操做,偏向得到他的第一個線程

jdk1.6開始默認,經過-XX:+UseBaisedLocking設置

鎖類型的變化過程以下圖:

相關文章
相關標籤/搜索