1. 程式人生 > 遊戲 >Mages宣佈《五等分的花嫁 夏日回憶也五等分》銷量突破5萬份

Mages宣佈《五等分的花嫁 夏日回憶也五等分》銷量突破5萬份

2019獨角獸企業重金招聘Python工程師標準>>> hot3.png

何謂自旋鎖?它是為實現保護共享資源而提出一種鎖機制。其實,自旋鎖與互斥鎖比較類似,它們都是為了解決對某項資源的互斥使用。無論是互斥鎖,還是自旋鎖,在任何時刻,最多隻能有一個保持者,也就說,在任何時刻最多隻能有一個執行單元獲得鎖。但是兩者在排程機制上略有不同。對於互斥鎖,如果資源已經被佔用,資源申請者只能進入睡眠狀態。但是自旋鎖不會引起呼叫者睡眠,如果自旋鎖已經被別的執行單元保持,呼叫者就一直迴圈在那裡看是否該自旋鎖的保持者已經釋放了鎖,自旋一詞就是因此而得名。

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