樂觀鎖: cas aba
版本號(atomicstampedreference)
時間戳atomicmarkablereference(boolean)
可重入**:絕對執行緒安全,不依賴共享資料(使用引數,區域性變數)
自旋鎖:認為鎖很快釋放,占用cpu迴圈獲取鎖,超過一定次數(時間)再掛起執行緒,自旋次數上限-xx:preblockspin,啟用自旋-xx:+usespinning(1.6後預設開啟)
自適應自旋:自旋次數上限不再固定,根據監控資料自旋容易成功那就長點,不容易就短點甚至不自旋
鎖消除:jit根據執行緒逃逸分析去除同步
鎖粗化:連續小範圍的同一把鎖的加解鎖進行擴大
可偏向和無鎖鎖標誌都是01,通過偏向鎖標記來區分
偏向鎖:消除資料在無競爭下的同步原語,-xx:+usebiasedlocking(1.6後預設)
可偏向(01,1)有三種小狀態:
可偏向但未偏向(threadid=0),已偏向(加鎖或未加鎖狀態,是否處於加鎖狀態只能看執行緒是否處於同步**塊內)
對於owner執行緒以後的加鎖解鎖只需要test一下是自己,不做任何修改操作(解鎖後自己還是那個偏向執行緒)
其他執行緒加鎖:偏向執行緒已不存在,重偏向(threadid設為0,然後cas改為自己)
偏向執行緒還存在:撤銷偏向(過程中需稍微暫停喚醒原執行緒)
1原執行緒已退出同步塊,恢復為無鎖模式
2 原執行緒在同步塊內,恢復為輕量級鎖定模式
輕量級鎖定:重量級鎖定(作業系統互斥量,效能消耗大),考慮在無競爭下(若開啟自旋,可認為存在輕微競爭)使用cas就好,輕量級鎖定下一定不會有執行緒阻塞(可能有自旋)
加鎖過程:當前執行緒棧幀建立lock record(存放displaced mark word,即原始的mark word),cas將mark word 更新為指向lock record的指標
更新失敗(過程中其他執行緒搶先cas了)或後續其他執行緒更新失敗(若mark word是01無鎖,更新為指向自己的輕量級鎖定),說明物件已加鎖,若開啟了自旋,則自旋cas嘗試加鎖,自旋到上限或未開啟自旋,膨脹為重量級鎖定,執行緒阻塞
解鎖過程:cas將displaced mark word替換到mark word內,cas失敗(其他執行緒嘗試加鎖導致膨脹為重量級鎖定,mark word 已經改變了)不僅要釋放鎖還要喚醒掛起執行緒
JVM執行緒安全與鎖優化
1.不可變 不可變的物件一定是執行緒安全的。如string類。2.絕對執行緒安全 3.相對執行緒安全 4.執行緒相容 5.執行緒對立 1.互斥同步 阻塞式同步 1 同步指的是 多個執行緒併發訪問共享資料時,保證共享資料在同一時刻只能被乙個執行緒使用。2 互斥指的是 同步的手段。如 臨界區 互斥量和訊...
執行緒安全與同步 鎖優化
無同步 a.可重入 b.threadlocal 互斥同步 阻塞同步 synchronized lock lock的優勢 可中斷 可有多個newcondition 自定義是否公平鎖 非阻塞同步 cas 機器指令實現 unsafe loop cas cas問題 a.aba問題 解決 加鎖 b.迴圈等待問...
執行緒安全與鎖
1 原子操作 操作只有一步,不會被其他的操作打斷 2 系統一般會帶有一些原子操作的函式留給使用者使用,但是數量較少,並且一般只能用於簡單特定的場合 1 鎖就是乙個flag,他的作用是說現在某個資源正在被某個執行緒使用,別的執行緒都別想輕易的拿去使用,巨集觀上表現就好像是給這些資源新增了乙個鎖,被鎖住...