synchronized鎖可以分為:偏向鎖、輕量級鎖、重量級鎖。
(1)偏向鎖:
實際情況下大部分的同步方法都是只有乙個執行緒來重複的獲取它,並不存在多執行緒來競爭鎖的使用權,為了避免直接加鎖造成的資源消耗,一開始獲取同步方法使用權的時候使用的是偏向鎖。當乙個執行緒a想要獲取同步方法使用權時,會先獲取鎖物件頭部mark word區域的threadid變數,使用cas的方式將它設定指向當前執行緒,如果成功,那麼就視為當前執行緒獲取了同步方法的使用權。但是需要注意的是偏向鎖並不會主動的釋放,當另乙個執行緒b到來,會先獲取鎖物件頭部的threadid,此時threadid為a,那麼就需要判斷a執行緒是否存活,如果不存活,那麼b獲取偏向鎖的使用權,如果a存活,就需要判斷a是否還在使用偏向鎖,如果不再使用偏向鎖的話,那麼b也會獲取使用權,否則,就需要先暫停執行緒a,將偏向鎖公升級為輕量級鎖
(2)輕量級鎖
輕量級的鎖是用於競爭鎖的執行緒比較少的情況,此時如果執行緒沒有獲取到鎖的話,就會陷於自旋狀態,不會阻塞,減少喚醒阻塞執行緒的資源消耗,但是自旋的執行緒會消耗一定的cpu資源。
接著(1)來說,此時a執行緒被暫停,它會將鎖物件頭部的mark word區域的資料儲存進a執行緒棧中的一塊區域中,然後將儲存位址以cas的方式放入鎖物件頭中。而執行緒b,它也會將mark word儲存進自己的棧,但是cas的時候由於當前鎖物件頭中已經儲存了a執行緒棧中的位址,所以它獲取鎖會失敗,因此就會陷入自旋的狀態,等待a執行緒釋放鎖。但是他如果自旋達到一定的次數,或者又有其他執行緒c來獲取鎖的話,那麼輕量級鎖就會公升級為重量級鎖。
(3)重量級鎖:
鎖公升級的過程是不可逆的,也就是說不能從重量級到輕量級再到偏向鎖,當獲取重量級鎖失敗的執行緒會陷入阻塞,等待鎖被釋放後喚醒
鎖粗化:有時候我們會使用同步**塊,這樣會使鎖的粒度更小,但是在一些極端情況下兩個同步**塊相隔非常近,這樣就有可能會發生頻繁的申請和釋放鎖,所以可以考慮把多個小的同步**塊,合成乙個,以降低短時間內大量鎖請求和釋放造成的效能損耗。
鎖消除:有的時候操作本身就是執行緒安全的,並不需要加鎖,比較像stringbuffer物件的相關操作,但我們卻對它的操作加了synchronized鎖,這個時候編譯器會對我們的**進行優化,消除多餘的鎖。但是**必須執行在jvm的server模式下,同時還需要開啟鎖消除。
-server -xx:+doescapeanalysis -xx:+eliminatelocks
其中+doescapeanalysis表示開啟逃逸分析,+eliminatelocks表示鎖消除。
執行緒和鎖,鎖公升級
程式 qq.exe feiqiu.exe 這種靜靜的躺在硬碟的軟體 程序 當程式載入到記憶體進行執行的就是程序資源分配的基本單位 執行緒 是程式執行的基本單位 執行緒如何進行排程的?linux是執行緒排程器,os 作業系統 執行緒切換的概念是什麼?context switch cpu儲存現場執行新執...
鎖的阻塞,死鎖,鎖公升級
因為不同鎖之間的相容性關係,所以在有些時刻,乙個事務中的鎖需要等待另乙個事務中的鎖釋放它所占用的資源。在innodb儲存引擎的源 中,用mutex資料結構來實現鎖。在訪問資源前需要用mutex enter函式進行申請,在資源訪問或修改完畢後立即執行mutex exit函式 當乙個資源已被乙個事務占有...
SQL Server 控制鎖公升級
背景知識 鎖公升級的路線圖 行 頁 區 extent 區 表分割槽 表 alter table 控制鎖的公升級行為 1 table sql server 2008中的預設行為,設為這個值時,在表級別啟用了鎖公升級,不管表是否分割槽。2 auto 如果以分割槽就在分割槽級別啟用鎖公升級,如果沒有分割槽...