1. 程式人生 > 其它 >Java鎖的機制 - synchronized優化

Java鎖的機制 - synchronized優化

在java 1.6 之前,synchronized的底層原理是通過monitorenter和monitorexit來實現的。monitor可以想象成只能容納一位客人的房間,每一個執行緒相當於一個客人,如果房間裡面有一個客人,那麼其他客人(執行緒·)就需要在房間外面等待。

在java1.6之後,進行了大量優化,其中物件有四種狀態:無鎖、偏向鎖、輕量級鎖、重量級鎖。

物件頭存放的Mark Word 32bit 和Class 指標。Mard Work中最後2bit表明這個物件什麼狀態。01的話,需要看倒數第3bit是否為0,如果為0,則是無鎖狀態。如果為1,則是偏向鎖狀態。最後兩位為00,為輕量級鎖狀態,為10,為重量級鎖狀態。偏向鎖狀態是,前23bit存放的是當前執行緒的id值。輕量級鎖狀態,29bit存放的指向棧中鎖記錄的指標。該棧在虛擬機器棧中開闢的lock record記憶體區域。棧幀中存放有指向這個物件的引用。重量級鎖狀態,前23bit存放的是指向重量級鎖的指標。

 

// todo

自旋鎖、適應性自旋鎖、鎖升級。

 

自旋鎖: 當升級為輕量級鎖時,其他想要申請鎖的執行緒需要進行自旋判斷,一般次數為10次,當有兩個以上的執行緒申請這個鎖的時候,輕量級鎖會升級為重量級鎖。但上個一鎖成功之後,自旋鎖也會堅持更長時間的自旋,因為上一次申請成功,這叫做適應性自旋鎖。