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的前後順序進行。線程