鎖實現互斥同步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設置
鎖類型的變化過程以下圖: