自旋鎖與自適應自旋

2021-10-24 23:30:38 字數 1033 閱讀 8048

上一節討論同步鎖提到,等待鎖的執行緒進入阻塞狀態是需要從使用者態切換到核心態,這種操作會給系統的併發帶來非常大的壓力。於是,在有多個處理器的情況下,我們樂觀的認為 「等一下」,不放棄處理器時間,或許持有鎖的執行緒很快就會釋放鎖。為了讓執行緒等待,需要讓執行緒執行乙個忙迴圈(while(true)),這項技術就叫做自旋

自旋鎖解決的問題就是:避免使用者執行緒和核心切換的消耗

但執行緒自旋是需要消耗cpu的,如果一直獲取不到鎖,那執行緒也不能一直占用cpu自旋做無用功,所以需要設定乙個自旋等待的最大時間。 如果持有鎖的執行緒執行的時間超過自旋等待的最大時間扔沒有釋放鎖,就會導致其它爭用鎖的執行緒在最大等待時間內還是獲取不到鎖,這時爭用執行緒會停止自旋進入阻塞狀態。

自旋鎖的優缺點:自旋鎖盡可能的減少執行緒的阻塞,這對於鎖的競爭不激烈,且占用鎖時間非常短的**塊來說效能能大幅度的提公升,因為自旋的消耗會小於執行緒阻塞掛起再喚醒的操作的消耗,阻塞掛起再喚醒這些操作會導致執行緒發生兩次上下文切換!

但是如果鎖的競爭激烈,或者持有鎖的執行緒需要長時間占用鎖執行同步塊,執行緒占用cpu自旋的消耗大於執行緒阻塞掛起操作的消耗,其它需要cpu的執行緒又不能獲取到cpu,造成cpu的浪費,所以這種情況下我們要關閉自旋鎖。

2、jvm對於自旋週期的選擇,jdk1.5這個限度是一定的寫死的,在1.6引入了適應性自旋鎖,適應性自旋鎖意味著自旋的時間不再是固定的了,而是由前一次在同乙個鎖上的自旋時間以及鎖的擁有者的狀態來決定。如果在同乙個鎖物件上,自旋等待剛剛成功獲得過鎖,並且持有鎖的執行緒正在執行當中,那麼虛擬機器認為這次也有可能再次成功,進而允許它自旋時間更久一點,比如100個迴圈。相反,如果對於某個鎖,自旋很少成功過 ,那麼會忽略自旋過程直接進入阻塞,以免造成cpu浪費。

自旋鎖的開啟 jdk1.6中-xx:+usespinning開啟;

-xx:preblockspin=10 為自旋次數;

jdk1.7後,去掉此引數,由jvm控制;

自旋鎖以及可重入自旋鎖

首先是簡單的自旋鎖 實現 package org.cc.concur public class mylock private boolean islocked false public synchronized void lock throws interruptedexception islock...

讀寫鎖與自旋鎖

一 讀寫鎖 1 特點 讀寫鎖比mutex有更高的適用性,可以多個執行緒同時占用讀模式的讀寫鎖,但是只能乙個執行緒占用寫模式的讀寫鎖。1 當讀寫鎖是寫加鎖狀態時,在這個鎖被解鎖之前,所有試圖對這個鎖加鎖的執行緒都會被阻塞 2 當讀寫鎖在讀加鎖狀態時,所有試圖以讀模式對它進行加鎖的執行緒都可以得到訪問權...

互斥鎖與自旋鎖

一 互斥鎖 當鎖時可用的,呼叫上鎖的api會成功,並且將鎖設定為不再可用。當乙個程序嘗試獲取不可用的鎖的時候它會阻塞,直到鎖被釋放。進入臨界區時獲得鎖,退出臨界區時釋放鎖。二 自旋鎖 是指當乙個執行緒在獲取鎖的時候,如果鎖已經被其它執行緒獲取,那麼該執行緒將迴圈等待,然後不斷的判斷鎖是否能夠被成功獲...