首先是簡單的自旋鎖**實現:
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 變數所需的編碼較少,並且執行時開銷也較少,但是它所能實現的功能也僅是 ...
自旋鎖 原理
跟互斥鎖一樣,乙個執行單元要想訪問被自旋鎖保護的共享資源,必須先得到鎖,在訪問完共享資源後,必須釋放鎖。如果在獲取自旋鎖時,沒有任何執行單元保持該鎖,那麼將立即得到鎖 如果在獲取自旋鎖時鎖已經有保持者,那麼獲取鎖操作將自旋在那裡,直到該自旋鎖的保持者釋放了鎖。由此我們可以看出,自旋鎖是一種比較低階的...