認真的講一講 自旋鎖到底是什麼

2022-09-15 21:18:20 字數 1346 閱讀 8942

自旋鎖(spinlock):是指當乙個執行緒在獲取鎖的時候,如果鎖已經被其它執行緒獲取,那麼該執行緒將迴圈等待,然後不斷的判斷鎖是否能夠被成功獲取,直到獲取到鎖才會退出迴圈。

獲取鎖的執行緒一直處於活躍狀態,但是並沒有執行任何有效的任務,使用這種鎖會造成busy-waiting。

j**a如何實現自旋鎖?

下面是個簡單的例子:

* date: 2023年1月4日 下午4:41:50

* @author medusar

public class spinlock else else else {

// 如果不為null,表示有執行緒在等待獲取鎖,此時將等待執行緒對應的節點鎖狀態更新為false,同時將當前執行緒的後繼節點設為null

currentnode.next.islocked = false;

currentnode.next = null;

4. clhlock 和 mcslock

都是基於鍊錶,不同的是clhlock是基於隱式鍊錶,沒有真正的後續節點屬性,mcslock是顯示鍊錶,有乙個指向後續節點的屬性。

將獲取鎖的執行緒狀態借助節點(node)儲存,每個執行緒都有乙份獨立的節點,這樣就解決了ticketlock多處理器快取同步的問題。

自旋鎖與互斥鎖

自旋鎖與互斥鎖都是為了實現保護資源共享的機制。

無論是自旋鎖還是互斥鎖,在任意時刻,都最多只能有乙個保持者。

獲取互斥鎖的執行緒,如果鎖已經被占用,則該執行緒將進入睡眠狀態;獲取自旋鎖的執行緒則不會睡眠,而是一直迴圈等待鎖釋放。

自旋鎖:執行緒獲取鎖的時候,如果鎖被其他執行緒持有,則當前執行緒將迴圈等待,直到獲取到鎖。

自旋鎖等待期間,執行緒的狀態不會改變,執行緒一直是使用者態並且是活動的(active)。

自旋鎖如果持有鎖的時間太長,則會導致其它等待獲取鎖的執行緒耗盡cpu。

自旋鎖本身無法保證公平性,同時也無法保證可重入性。

基於自旋鎖,可以實現具備公平性和可重入性質的鎖。

ticketlock:採用類似銀行排號叫好的方式實現自旋鎖的公平性,但是由於不停的讀取servicenum,每次讀寫操作都必須在多個處理器快取之間進行快取同步,這會導致繁重的系統匯流排和記憶體的流量,大大降低系統整體的效能。

clhlock和mcslock通過鍊錶的方式避免了減少了處理器快取同步,極大的提高了效能,區別在於clhlock是通過輪詢其前驅節點的狀態,而mcs則是檢視當前節點的鎖狀態。

clhlock在numa架構下使用會存在問題。在沒有cache的numa系統架構中,由於clhlock是在當前節點的前乙個節點上自旋,numa架構中處理器訪問本地記憶體的速度高於通過網路訪問其他節點的記憶體,所以clhlock在numa架構上不是最優的自旋鎖。

講一講IP位址

ip位址組成ip位址分類 為了適應不同的網路,ip位址空間被分為5類,分別是a,b,c,d和e類,其中a,b,c類最常用,d類用於組播,e類用於科研。從上述 中可以看到,每個網路中的主機數都是2 主機位 2,那是因為網路中有一些位址被保留,不能分配給網路使用,有哪些保留位址呢?其實主要有兩類,一類叫...

講一講抽象工廠模式

1.新建產品族介面 我這裡可以理解為生產乙個產品需要兩個步驟 步驟1 public inte ce iproduct1 步驟2 public inte ce iproduct2 2.新建工廠介面 乙個工廠生產乙個產品都需要這兩個步驟 public inte ce ifactory 3.新建各個產品的...

第一講與第二講

進入這個新的家庭後,第一感覺是 這是乙個新的開始,所有人的臉上都充滿了希望。我希望自己沒有後悔來這裡。今日結果 就我個人來言,我認為老師講的課程很精細,而且也很豐富,有時候老師還會帶一點小幽默,這讓我理解起來很容易,作業老師布置的很完整,能讓課堂學到的知識充分得以應用,並且把作業在第二天進行詳細的講...