自旋鎖以及可重入自旋鎖

2021-09-01 16:34:20 字數 2971 閱讀 1110

首先是簡單的自旋鎖**實現:

package org.cc.concur;

public class mylock

private boolean islocked=false;

public synchronized void lock() throws interruptedexception

islocked=true;

system.out.println(thread.currentthread().getname()+"正在執行");

thread.currentthread().sleep(1000); }

public synchronized void unlock()

}

這是乙個最簡單的自旋鎖

有如下特點:

以上的特點用如下**來測試:

// 正常使用情況

public void testlock() throws interruptedexceptioncatch(exception e)finally

}}, "執行緒2");

thread.start();

lock.lock();

system.out.println("-------主線程正在執行");

thread.sleep(1000);

system.out.println("-------主線程執行結束。。。。。。");

lock.unlock();

}

輸出:

main正在執行

-------主線程正在執行

執行緒1堵塞了

-------主線程執行結束。。。。。。

執行緒1正在執行

// 非鎖定執行緒使用了unlock

thread thread=new thread(new runnable()catch(exception e)finally

}}, "執行緒1");

這樣可以看出 任何的非鎖定執行緒的執行緒都可以解開鎖

main正在執行

-------主線程正在執行

執行緒1正在執行

-------主線程執行結束。。。。。。

-------1執行緒正在執行

最後一種就是重入的情況:

lock.lock();

lock.lock();

system.out.println("-------主線程正在執行");

thread.sleep(1000);

system.out.println("-------主線程執行結束。。。。。。");

lock.unlock();

輸出:

main正在執行

main堵塞了

執行緒1堵塞了

以上的地方改進很簡單

設定乙個屬性儲存進入的執行緒物件  並進行一些判斷

以上一些缺點共同寫入了**:

package org.cc.concur;

public class mylockreentrancelock

private boolean islocked=false;

private int count=0;

private object currentthread=null;

public synchronized void lock() throws interruptedexception

currentthread=thread.currentthread();

if(count==0)

count++;

system.out.println(thread.currentthread().getname()+"正在執行");

thread.sleep(1000); }

public synchronized void unlock()

if(count==0) }

public static void main(string args) throws interruptedexceptioncatch(exception e)finally

}}, "執行緒1");

thread thread2=new thread(new runnable()catch(exception e)finally

}}, "執行緒2");

thread2.start();

thread.start();

lock.lock();

lock.lock();

system.out.println("主線程正在執行。。。。。");

thread.sleep(1000);

system.out.println("主線程執行結束。。。。。。");

lock.unlock();

lock.unlock(); }

}

一次執行時的情況:

main正在執行

main正在執行

主線程正在執行。。。。。

執行緒1堵塞了

執行緒2堵塞了

主線程執行結束。。。。。。

---狀態:main: 1

---狀態:main: 0

main-----解放了鎖

執行緒2正在執行

-------2執行緒正在執行

執行緒1堵塞了

-------2執行緒執行結束。。。。。。

---狀態:執行緒2: 0

執行緒2-----解放了鎖

執行緒1正在執行

-------1執行緒正在執行

-------1執行緒執行結束。。。。。。

---狀態:執行緒1: 0

執行緒1-----解放了鎖

java鎖 自旋鎖

什麼是自旋鎖?所謂自旋鎖是指不會引起呼叫者睡眠,若鎖資源被其他執行緒占有,則會迴圈檢查鎖資源的佔有者是否已經釋放鎖。總結下來自旋鎖就是原子操作 自迴圈 如何實現自旋鎖?自旋鎖的原理是通過cas實現,其中cas是比較並交換,本身是使用它的原子性的compareandset方法。cas 操作中包含三個運...

併發程式設計實戰4 自旋鎖,死鎖,以及鎖重入詳解

自旋鎖 死鎖 可見 乙個執行緒修改了這個變數的值,在另外乙個執行緒中能夠立即讀到這個修改後的值。volatile 變數可以被看作是一種 程度較輕的 synchronized 與 synchronized 塊相比,volatile 變數所需的編碼較少,並且執行時開銷也較少,但是它所能實現的功能也僅是 ...

自旋鎖 原理

跟互斥鎖一樣,乙個執行單元要想訪問被自旋鎖保護的共享資源,必須先得到鎖,在訪問完共享資源後,必須釋放鎖。如果在獲取自旋鎖時,沒有任何執行單元保持該鎖,那麼將立即得到鎖 如果在獲取自旋鎖時鎖已經有保持者,那麼獲取鎖操作將自旋在那裡,直到該自旋鎖的保持者釋放了鎖。由此我們可以看出,自旋鎖是一種比較低階的...