1. 程式人生 > >偏向鎖、 輕量級鎖 、 重量級鎖

偏向鎖、 輕量級鎖 、 重量級鎖

鎖的4種狀態

      無鎖狀態

      偏向鎖

      輕量級鎖

      重量級鎖

    一個物件剛開始例項化的時候,沒有任何執行緒來訪問它,處於無鎖狀態。

當第一個執行緒來訪問它,它會偏向這個執行緒,此時,物件持有偏向鎖。

這個執行緒在修改物件頭成為偏向鎖時使用CAS操作,並將物件頭中的ThreadID改成自己的ID,

之後再次訪問這個物件時,只需要對比ID,不需要再使用CAS在進行操作。

因為偏向鎖不會主動釋放,當第二個執行緒訪問時引起競爭

檢查原來持有該物件鎖的執行緒是否依然存活,

如果掛了,則可以將物件變為無鎖狀態

如果原來的執行緒依然存活,且仍然需要持有偏向鎖,則偏向鎖升級為輕量級鎖

如果不存在使用了,則可以將物件回覆成無鎖狀態。

    輕量級鎖認為競爭存在,但是競爭的程度很輕,一般兩個執行緒對於同一個鎖的操作都會錯開,或者說稍微等待一下(自旋),另一個執行緒就會釋放鎖。

但是當自旋超過一定的次數,

或者一個執行緒在持有鎖,一個在自旋,又有第三個來訪時,輕量級鎖膨脹為重量級鎖,

重量級鎖使除了擁有鎖的執行緒以外的執行緒都阻塞,防止CPU空轉。