自旋鎖

public class SpinLock{
private AtomicReference<Thread> sign = new AtomicReference<>();

public void Lock(){
Thread current = Thread.currentThread();
while(! sign.compareAndSet(null, current)){}//預計本來的onwer爲null,將owner設置爲current
}

public void Unlock(){
Thread current = Thread.currentThread();
sign.compareAndSet(current, null));
}
}

使用了CAS原子操做,lock函數將owner設置爲當前線程,而且預測原來的值爲空。unlock函數將owner設置爲null,而且預測值爲當前線程。函數

當有第二個線程調用lock操做時因爲owner值不爲空,致使循環一直被執行,直至第一個線程調用unlock函數將owner設置爲null,第二個線程才能進入臨界區。性能

因爲自旋鎖只是將當前線程不停地執行循環體,不進行線程狀態的改變,因此響應速度更快。但當線程數不停增長時,性能降低明顯,由於每一個線程都須要執行,佔用CPU時間。若是線程競爭不激烈,而且保持鎖的時間段。適合使用自旋鎖。spa

注:該例子爲非公平鎖,得到鎖的前後順序,不會按照進入lock的前後順序進行。線程

相關文章
相關標籤/搜索