Mages宣佈《五等分的花嫁 夏日回憶也五等分》銷量突破5萬份
阿新 • • 發佈:2021-05-20
何謂自旋鎖?它是為實現保護共享資源而提出一種鎖機制。其實,自旋鎖與互斥鎖比較類似,它們都是為了解決對某項資源的互斥使用。無論是互斥鎖,還是自旋鎖,在任何時刻,最多隻能有一個保持者,也就說,在任何時刻最多隻能有一個執行單元獲得鎖。但是兩者在排程機制上略有不同。對於互斥鎖,如果資源已經被佔用,資源申請者只能進入睡眠狀態。但是自旋鎖不會引起呼叫者睡眠,如果自旋鎖已經被別的執行單元保持,呼叫者就一直迴圈在那裡看是否該自旋鎖的保持者已經釋放了鎖,自旋一詞就是因此而得名。
import java.util.concurrent.atomic.AtomicReference; class SpinLock { //java中原子(CAS)操作 AtomicReference<Thread> owner = new AtomicReference<Thread>();//持有自旋鎖的執行緒物件 private int count; public void lock() { Thread cur = Thread.currentThread(); //lock函式將owner設定為當前執行緒,並且預測原來的值為空。 //unlock函式將owner設定為null,並且預測值為當前執行緒。 //當有第二個執行緒呼叫lock操作時由於owner值不為空,導致迴圈 //一直被執行,直至第一個執行緒呼叫unlock函式將owner設定為null,第二個執行緒才能進入臨界區。 while (!owner.compareAndSet(null, cur)){ } } public void unLock() { Thread cur = Thread.currentThread(); owner.compareAndSet(cur, null); } } public class Test implements Runnable { static int sum; private SpinLock lock; public Test(SpinLock lock) { this.lock = lock; } public static void main(String[] args) throws InterruptedException { SpinLock lock = new SpinLock(); for (int i = 0; i < 100; i++) { Test test = new Test(lock); Thread t = new Thread(test); t.start(); } Thread.currentThread().sleep(1000); System.out.println(sum); } @Override public void run() { this.lock.lock(); sum++; this.lock.unLock(); } }
轉載於:https://my.oschina.net/kdy1994/blog/866196