java併發程式設計的藝術(一)---鎖的基本屬性
阿新 • • 發佈:2018-12-30
這兩天在看《java併發程式設計的藝術》,記錄下看到的知識當做筆記吧!
java中的synchronized鎖是儲存在物件頭中的,內容是mark word,長度根據計算機的位數來定32 or 64bit,
鎖一共有4種狀態,級別從低到高依次是:無鎖,偏向鎖,輕量級鎖,重量級鎖。鎖只能逐一升級,不能降級。目的是為了提高獲得鎖和釋放鎖的效率。
1、偏向鎖:當不存在多執行緒競爭時候,鎖資源總是由同一個執行緒多次獲得,所以為了節省執行緒獲得鎖的代價而引入偏向鎖, 當檢測物件中的mark word中執行緒id為當前執行緒時候,就預設獲得了鎖,若是沒有,則檢測是否偏向鎖1,是則使用CAS將物件頭偏向鎖指向當前程序,不是的話則使用cas競爭鎖。
當有多執行緒競爭時候,才能釋放鎖的機制,當全域性安全點時候,暫停偏向鎖的程序,執行緒不處於活躍狀態則將物件頭設定成無鎖狀態。
偏向鎖是預設開啟的,可以用 -XX:BiasdLockingStartupDelay=0 關閉偏向鎖,程式會預設進入輕量級鎖。
2、輕量級鎖:
加鎖:執行緒先獲取物件頭中的mark word複製到鎖記錄 Displaced mark word中,然後嘗試使用CAS將物件頭中mark word替換為當前鎖記錄的指標,成功則獲得鎖,失敗則表示其他執行緒競爭鎖,執行緒則使用自旋來獲取鎖
解鎖:執行緒解鎖時,使用cas操作將Displaced mark word替換回物件頭,成功則沒有鎖競爭,失敗則鎖會膨脹成重量級鎖。
3、重量級鎖:因為自旋會消耗cpu,為了避免無用的自旋,當升級成為重量級鎖就不會再回復到輕量級,只有當持有鎖的執行緒釋放鎖後,便會喚醒等待的執行緒,讓等待的執行緒再去爭奪鎖。
鎖的優缺點對比: