輕量級鎖在加鎖過程中,用到了自旋鎖
所謂自旋,就是指當有另外乙個執行緒來競爭鎖時,這個執行緒會在原地迴圈等待,而不是把該執行緒給阻塞,直到那個獲得鎖的執行緒釋放鎖之後,這個執行緒就可以馬上獲得鎖的。
注意,鎖在原地迴圈的時候,是會消耗cpu的,就相當於在執行乙個啥也沒有的for迴圈。
所以,輕量級鎖適用於那些同步**塊執行的很快的場景,這樣,執行緒原地等待很短的時間就能夠獲得鎖了。
自旋鎖的使用,其實也是有一定的概率背景,在大部分同步**塊執行的時間都是很短的。所以通過看似無異議的迴圈反而能提公升鎖的效能。
但是自旋必須要有一定的條件控制,否則如果乙個執行緒執行同步**塊的時間很長,那麼這個執行緒不斷的迴圈反而會消耗cpu資源。預設情況下自旋的次數是10次,可以通過 preblockspin來修改
在jdk1.6之後,引入了自適應自旋鎖,自適應意味著自旋的次數不是固定不變的,而是根據前一次在同乙個鎖上自旋的時間以及鎖的擁有者的狀態來決定。
如果在同乙個鎖物件上,自旋等待剛剛成功獲得過鎖,並且持有鎖的執行緒正在執行中,那麼虛擬機器就會認為這次自旋也是很有可能再次成功,進而它將允許自旋等待持續相對更長的時間。如果對於某個鎖,自旋很少成功獲得過,那在以後嘗試獲取這個鎖時將可能省略掉自旋過程,直接
阻塞執行緒,避免浪費處理器資源
多執行緒鎖的公升級和無鎖 偏向鎖 輕量級鎖 重量級鎖
隨著競爭情況逐漸公升級,鎖可以公升級但不能降級。鎖一共四種狀態,低 高無鎖狀態 偏向鎖狀態 輕量級鎖狀態 重量級鎖狀態。偏向鎖 優點 加鎖和解鎖不需要額外的消耗,和執行非同步方法相逼僅存在納秒級的差距。缺點 如果執行緒間存在鎖競爭,會帶來額外的鎖撤銷的消耗 適用只有乙個執行緒訪問同步塊場景 輕量級鎖...
MySQL的讀鎖和解鎖
讀鎖和解鎖其實只是一句sql語句,語法 lock unlock tables tbl name as alias lock type tbl name as alias lock type 等等 lock type 鎖型別 read local low priority write lock tab...
oracle鎖表檢視被鎖的表和解鎖
以下幾個為相關表 select from v lock select from v sqlarea select from v session select from v process select from v locked object select from all objects sele...