1. 程式人生 > >偏向鎖-輕量鎖-重量鎖-自旋鎖

偏向鎖-輕量鎖-重量鎖-自旋鎖

自旋鎖

自選鎖其實就是在拿鎖時發現已經有執行緒拿了鎖,一般情況下需要阻塞自己,但是這種掛起和喚醒需要切換至核心程序耗費資源,這個時候會選擇進行忙等迴圈嘗試。也就是不停迴圈看是否能等到上個執行緒自己釋放鎖。這個問題是基於一個現實考量的:很多拿了鎖的執行緒會很快釋放鎖。因為一般敏感的操作不會很多。當然這個是一個不能完全確定的情況,只能說總體上是一種優化。

自旋適應鎖

自旋的次數不固定,它是由前一次在同一個鎖上的自旋時間及鎖的擁有者的狀態來決定。如果自旋成功,那麼下次自旋的次數會更多,因為虛擬機器認為既然上次成功了,那麼此次自旋也很有可能會再次成功。反之,以後自旋的次數會減少甚至省略掉自旋過程,以免浪費處理器資源。

鎖消除

通過逃逸分析發現其實根本就沒有別的執行緒產生競爭的可能,而“自作多情”地給自己加上了鎖。虛擬機器會直接去掉這個鎖。稱為鎖消除。

鎖粗化

一個迴圈裡面有很多synchronized關鍵字,因其頻繁地拿鎖釋放鎖,開銷很大。虛擬機器對此適當擴大加鎖的範圍以避免頻繁的拿鎖釋放鎖的過程。

鎖膨脹

一個鎖從偏向鎖開始,只能沿著 偏向鎖 -> 輕量鎖 -> 重量鎖 的方向進行膨脹升級,不能進行鎖的降級。

偏向鎖 -> 輕量鎖 -> 重量鎖

這邊書上說的不是很詳細,關於鎖操作的流程資料也不多,以下有兩點先說明:

  1. CAS的預估值是鎖識別符號、HashCode:大家說鎖的膨脹過程是用CAS做判斷,但是CAS是需要預估值的,沒有一篇文章說過CAS的預估值是什麼,如果不知道預估值,怎麼才能明白什麼時候成功什麼時候失敗呢?根據觀察,我認為是用鎖識別符號+hashCode做預估值能準確判斷各種情況。
  2. 重量鎖是怎麼實現的:重量鎖用作業系統底層的Mutex Lock實現的鎖,是一種很耗費資源的鎖。



相關推薦

與互斥的對比、手工實現

                    本文之前,我只是對自旋鎖有所瞭解,知道它是做什麼的,但是沒有去測試實現過,甚至以為自旋鎖只有kernel用這個,今天才發現POSIX有提供自旋鎖的介面。下面我會分析一下自旋鎖,並程式碼實現自旋鎖和互斥鎖的效能對比,以及利用C++11實現自旋鎖。 一:自旋鎖(s

簡單的非公平以及基於排隊的公平的實現

基礎 什麼是自旋鎖 由於本文主要討論的都是自旋鎖,所以首先就需要弄明白什麼是自旋鎖。 自旋鎖最大的特徵,就是它會一直迴圈檢測鎖的狀態,當鎖處於被佔用的狀態時,不會將當前執行緒阻塞住,而是任由它繼續消耗CPU Cycles,直到發現需要的鎖處於可用狀態。

偏向--重量-

自旋鎖自選鎖其實就是在拿鎖時發現已經有執行緒拿了鎖,一般情況下需要阻塞自己,但是這種掛起和喚醒需要切換至核心程序耗費資源,這個時候會選擇進行忙等迴圈嘗試。也就是不停迴圈看是否能等到上個執行緒自己釋放鎖。這個問題是基於一個現實考量的:很多拿了鎖的執行緒會很快釋放鎖。因為一般敏感

synchronized實現原理及其優化-(偏向重量

1.synchronized概述:   synchronized修飾的方法或程式碼塊相當於併發中的臨界區,即在同一時刻jvm只允許一個執行緒進入執行。synchronized是通過鎖機制實現同一時刻只允許一個執行緒來訪問共享資源的。另外synchronized鎖機制還可以保證執行緒併發執行的原子性,有序性,可

Java Synchronized 的實現原理與應用 (偏向,,重量)

edm star 使用場景 安全 amp add [] 升級 ddr 簡介 在Java SE 1.6之前,Synchronized被稱為重量級鎖.在SE 1.6之後進行了各種優化,就出現了偏向鎖,輕量鎖,目的是為了減少獲得鎖和釋放鎖帶來的性能消耗. Synchroiz

本地與信號/多服務臺隊列-spin wait風格的信號

我們 一件事 以及 睡眠 為我 這也 鎖改變 蘇打水 mic 周日傍晚,我去家附近的超市(...)買蘇打水,準備自制青檸蘇打。我感覺我做的比買的那個巴黎水要更爽口。由於天氣太熱,非常多人都去超市避暑去了,超市也不攆人,這仿佛是他們的策略。人過來避暑了,走的時候難免要買些東

linux 和信號【轉】

you 修改 變種 能夠 體系結構 當下 top 數據 啟用 轉自:http://blog.csdn.net/xu_guo/article/details/6072823 版權聲明:本文為博主原創文章,未經博主允許不得轉載。 自旋鎖最多只能被一個可執行線程

Java---偏向、輕量級、重量級

center jdk1 startup 例如 單元 cati 保護 讀鎖 text 之前做過一個測試,反復執行過多次,發現結果是一樣的: 1. 單線程下synchronized效率最高(當時感覺它的效率應該是最差才對); 2. AtomicInteger效率最不穩定,不同並

偏向++輕量級??????

lock 當前 span sed 需要 back 默認 ase -c 首先了解對象頭MARK(對象頭標記,32位): 存儲GC標記,對象年齡,對象Hash,鎖信息(鎖記錄的指針,偏向鎖線程的ID) 大部分情況是沒有競爭的,所以可以通過偏向來提高性能 所謂的偏向,即鎖會偏向

linux 和信號

鎖死 something urn 問題: 循環 系統 編譯錯誤 detail 同步機制 自旋鎖最多只能被一個可執行線程持有(讀寫自旋鎖除外)。自旋鎖不會引起調用者睡眠,如果一個執行線程試圖獲得一個已經被持有的自旋鎖,那麽線程就會一直進行忙循環,一直等待下去(一直占用 CPU

作業系統 +訊號+互斥+臨界區+死的區別

自旋鎖(SpinLock) 自旋鎖是專為防止多處理器併發而引入的一種鎖。如果是單核處理器,則自旋鎖定義為空操作,因為簡單的關閉中斷即可實現互斥。   自旋鎖最多隻能被一個執行緒持有,如果一個執行緒試圖請求一個已被爭用(已被另一個執行緒持有)的自旋鎖,那麼等待自旋鎖的執行緒將會反

、互斥體和訊號

自旋鎖 Linux核心中最常見的鎖是自旋鎖(spin lock)。自旋鎖最多隻能被一個可執行執行緒持有。如果一個執行執行緒試圖獲得一個被已經持有的自旋鎖,那麼該執行緒就會一直進行忙迴圈——旋轉——等待鎖重新可用。要是鎖未被爭用,請求鎖的執行執行緒便能立刻得到它,繼續執行。在任意時間,自旋鎖都

linux核心 訊號、延時函式比較

       在驅動程式中,當多個執行緒同時訪問相同的資源時(驅動程式中的全域性變數是一種典型的共享資源),可能會引發"競態",因此我們必須對共享資源進行併發控制。Linux核心中解決併發控制的最常用方法是自旋鎖與訊號量(絕大多數時候作為互斥鎖使用)。   自

java 中的 -- 偏向、輕量級、重量級

之前做過一個測試,詳情見這篇文章《多執行緒 +1操作的幾種實現方式,及效率對比》,當時對這個測試結果很疑惑,反覆執行過多次,發現結果是一樣的:  1. 單執行緒下synchronized效率最高(當時感覺它的效率應該是最差才對);  2. AtomicInteger效率最不穩

偏向、輕量級、重量級膨脹)、消除、粗化

知識準備: 在開始前,首先清楚系統PV訊號機制 荷蘭學者Dijkstra於1965年提出的訊號機制是一種有效的程序同步與互斥工具。 1)整型訊號與PV操作 訊號量是一個整型變數,根據控制物件的不同被賦予不同的值。訊號量分為如下兩類: (1)公用訊號量。實現程序間的互

偏向,輕量級,重量級的詳細介紹

何為同步?JVM規範規定JVM基於進入和退出Monitor物件來實現方法同步和程式碼塊同步,但兩者的實現細節不一樣。程式碼塊同步是使用monitorenter和monitorexit指令實現,而方法同步是使用另外一種方式實現的,細節在JVM規範裡並沒有詳細說明,但是方法的同步

1.6的優化(適應性/粗化/削除/輕量級/偏向

     高效併發是JDK 1.6的一個重要主題,HotSpot虛擬機器開發團隊在這個版本上花費了大量的精力去實現各種鎖優化技術,如適應性自旋(Adaptive Spinning)、鎖削除(Lock Elimination)、鎖膨脹(Lock Coarsening)、輕量級

--、阻塞、可重入、悲觀、樂觀、讀寫偏向所、輕量級、重量級膨脹、物件和類

參考:http://blog.csdn.net/a314773862/article/details/54095819 自旋鎖 自旋鎖可以使執行緒在沒有取得鎖的時候,不被掛起,而轉去執行一個空迴圈,(即所謂的自旋,就是自己執行空迴圈),若在若干個空迴圈後,執行緒如果可以獲得

訊號, 互斥

一、訊號量 訊號量又稱為訊號燈,它是用來協調不同程序間的資料物件的,而最主要的應用是共享記憶體方式的程序間通訊。本質上,訊號量是一個計數器,它用來記錄對某個資源(如共享記憶體)的存取狀況。一般說來,為了獲得共享資源,程序需要執行下列操作:    (1) 測試控制該資源的訊號量。    (2) 若此訊號

java同步優化方案學習筆記(偏向,輕量級,重量級

目錄 一,概述 二,CAS 一,概述 什麼是java的鎖? 為什麼java要有鎖? java的鎖為什麼需要優化? 怎麼優化的? 1,java中使用synchronized關鍵字來實現同步功能,被synchronized修飾的方法