Java併發編程(3) JUC中的鎖

 一 前言

  前面已經說到JUC中的鎖主要是基於AQS實現,而AQS(AQS的內部結構 、AQS的設計與實現)在前面已經簡單介紹過了。今天記錄下JUC包下的鎖是怎麼基於AQS上實現的html

二 同步鎖

  同步鎖不是JUC中的鎖但也順便提下,它是由synchronized 關鍵字進行同步,實現對競爭資源互斥訪問的鎖。java

  同步鎖的原理:對於每個對象,有且僅有一個同步鎖;不一樣的線程能共同訪問該同步鎖。在同一個時間點該同步鎖能且只能被一個線程獲取到,其餘線程都得等待。多線程

  另外:synchronized是Java中的關鍵字且是內置的語言實現;它是在JVM層面上實現的,不但能夠經過一些監控工具監控synchronized的鎖定,並且在代碼執行時出現異常,JVM會自動釋放鎖定;synchronized等待的線程會一直等待下去,不能響應中斷。併發

三 JUC中的鎖結構

  相比同步鎖,JUC包中的鎖的功能更增強大,它爲鎖提供了一個框架,該框架容許更靈活地使用鎖(它由本身實現、須要手動釋放鎖、能響應中斷、能夠多線程跑提升效率等)。下圖是根據源碼中查出畫的類圖,便知它提供的鎖有好幾種,下面一一分析。app

四 可重入鎖-ReentrantLock

  重入鎖ReentrantLock,顧名思義:就是支持重進入的鎖,它表示該鎖可以支持一個線程對資源的重複加鎖。另外該鎖孩紙獲取鎖時的公平和非公平性選擇,因此它包含公平鎖與非公平鎖(它們兩也能夠叫可重入鎖)。首先提出兩個疑問:它怎麼實現重進入呢?釋放邏輯還跟AQS中同樣嗎?框架

非公平鎖

    final boolean nonfairTryAcquire(int acquires) {
        final Thread current = Thread.currentThread();
        int c = getState();
        if (c == 0) {
            if (compareAndSetState(0, acquires)) {
                setExclusiveOwnerThread(current);
                return true;
            }
        }
        // 同步狀態已經被其餘線程佔用,則判斷當前線程是否與被佔用的線程是同一個線程,若是是同一個線程則容許獲取,並state+1
        else if (current == getExclusiveOwnerThread()) {
            int nextc = c + acquires;
            if (nextc < 0) // overflow
                throw new Error("Maximum lock count exceeded");
            setState(nextc);
            return true;
        }
        return false;
    }

  該方法增長了再次獲取同步狀態的處理邏輯:經過判斷當前線程是否爲獲取鎖的線程來決定獲取操做是否成功。若是是獲取鎖的線程再次請求,則將同步狀態值進行增長並返回true,表示獲取同步狀態成功。ide

protected final boolean tryRelease(int releases) {
    int c = getState() - releases;
    if (Thread.currentThread() != getExclusiveOwnerThread())
        throw new IllegalMonitorStateException();
    boolean free = false;
    if (c == 0) {
        free = true;
        setExclusiveOwnerThread(null);
    }
    setState(c);
    return free;
}

  上面代碼是釋放鎖的代碼。若是該鎖被獲取了n次,那麼前(n-1)次都是返回false,直至state=0,將佔有線程設置爲null,並返回true,表示釋放成功。工具

公平鎖

  公平鎖與非公平鎖有啥區別呢? 仍是從源碼中分析吧。測試

protected final boolean tryAcquire(int acquires) {
    final Thread current = Thread.currentThread();
    int c = getState();
    if (c == 0) {
        // 區別:增長判斷同步隊列中當前節點是否有前驅節點的判斷
        if (!hasQueuedPredecessors() &&
                compareAndSetState(0, acquires)) {
            setExclusiveOwnerThread(current);
            return true;
        }
    }
    // 同樣支持重入
    else if (current == getExclusiveOwnerThread()) {
        int nextc = c + acquires;
        if (nextc < 0)
            throw new Error("Maximum lock count exceeded");
        setState(nextc);
        return true;
    }
    return false;
}

  與非公平鎖的惟一不一樣就是增長了一個判斷條件:判斷同步隊列中當前節點是否有前驅節點的判斷,若是方法返回true,則表示有線程比當前線程更早地請求獲取鎖,所以須要等待前驅線程獲取並釋放鎖以後才能繼續獲取鎖。ui

公平鎖與非公平鎖的區別

  從上面源碼中得知,公平性鎖保證了鎖的獲取按照FIFO原則,可是代價就是進行大量的線程切換。而非公平性鎖,可能會形成線程「飢餓」(不會保證先進來的就會先獲取),可是極少線程的切換,保證了更大的吞吐量。下面咱們看下案例:

import org.junit.Test;

import java.util.*;
import java.util.concurrent.*;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class FairAndUnfairTest {
    private static Lock fairLock = new ReentrantLock2(true);
    private static Lock unFairLock = new ReentrantLock2(false);

    @Test
    public void fair() throws Exception{
        testLock(fairLock);
    }

    @Test
    public void unFairLock() throws Exception{
        testLock(unFairLock);
    }

    private static void testLock(Lock lock) throws InterruptedException, ExecutionException {
        ExecutorService threadPool = Executors.newFixedThreadPool(5);
        List<Future<Long>> list = new ArrayList<>();
        for (int i = 0 ; i < 5; i++) {
            Future<Long> future = threadPool.submit(new Job(lock));
            list.add(future);
        }
        long cost = 0;
        for (Future<Long> future : list) {
            cost += future.get();
        }
        // 查看五個線程所需耗時的時間
        System.out.println("cost:" + cost + " ms");
    }

    private static class Job implements Callable<Long> {
        private Lock lock;
        public Job(Lock lock) {
            this.lock = lock;
        }
        @Override
        public Long call() throws Exception {
            long st = System.currentTimeMillis();
            // 同一線程獲取100鎖
            for (int i =0; i < 100; i ++) {
                lock.lock();
                try {
                    System.out.println("Lock by[" + Thread.currentThread().getId() + "]," +
                            "Waiting by[" + printThread(((ReentrantLock2)lock).getQueuedThreads()) + "]");
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    lock.unlock();
                }
            }
            // 返回100次所需的時間
            return System.currentTimeMillis() - st;
        }

        private String printThread(Collection<Thread> list) {
            StringBuilder ids = new StringBuilder();
            for (Thread t : list) {
                ids.append(t.getId()).append(",");
            }
            return ids.toString();
        }
    }

    private static class ReentrantLock2 extends ReentrantLock {
        public ReentrantLock2(boolean fair) {
            super(fair);
        }

        public Collection<Thread> getQueuedThreads() {
            List<Thread> arrayList = new ArrayList<>(super.getQueuedThreads());
            Collections.reverse(arrayList);
            return arrayList;
        }
    }
}

  非公平性鎖的測試結果,cost:117 ms

Lock by[9],Waiting by[]
Lock by[9],Waiting by[]
Lock by[9],Waiting by[]
Lock by[9],Waiting by[]
Lock by[9],Waiting by[]
Lock by[9],Waiting by[]
Lock by[9],Waiting by[]
Lock by[9],Waiting by[]
Lock by[9],Waiting by[]
Lock by[9],Waiting by[]
Lock by[9],Waiting by[]
Lock by[9],Waiting by[]
Lock by[9],Waiting by[]
Lock by[9],Waiting by[]
Lock by[9],Waiting by[]
Lock by[9],Waiting by[]
Lock by[9],Waiting by[]
Lock by[9],Waiting by[]
Lock by[9],Waiting by[]
Lock by[9],Waiting by[]
Lock by[9],Waiting by[]
Lock by[9],Waiting by[]
Lock by[9],Waiting by[]
Lock by[9],Waiting by[]
Lock by[9],Waiting by[]
Lock by[9],Waiting by[]
Lock by[9],Waiting by[]
Lock by[9],Waiting by[]
Lock by[9],Waiting by[]
Lock by[10],Waiting by[]
Lock by[10],Waiting by[9,]
Lock by[10],Waiting by[9,]
Lock by[10],Waiting by[9,11,]
Lock by[10],Waiting by[9,11,]
Lock by[10],Waiting by[9,11,12,]
Lock by[10],Waiting by[9,11,12,]
Lock by[10],Waiting by[9,11,12,]
Lock by[10],Waiting by[9,11,12,]
Lock by[10],Waiting by[9,11,12,]
Lock by[10],Waiting by[9,11,12,]
Lock by[10],Waiting by[9,11,12,]
Lock by[10],Waiting by[9,11,12,]
Lock by[10],Waiting by[9,11,12,]
Lock by[10],Waiting by[9,11,12,]
Lock by[10],Waiting by[9,11,12,]
Lock by[10],Waiting by[9,11,12,]
Lock by[10],Waiting by[9,11,12,]
Lock by[10],Waiting by[9,11,12,]
Lock by[10],Waiting by[9,11,12,]
Lock by[10],Waiting by[9,11,12,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[10],Waiting by[9,11,12,13,]
Lock by[9],Waiting by[11,12,13,]
Lock by[9],Waiting by[11,12,13,]
Lock by[9],Waiting by[11,12,13,]
Lock by[9],Waiting by[11,12,13,]
Lock by[9],Waiting by[11,12,13,]
Lock by[9],Waiting by[11,12,13,]
Lock by[9],Waiting by[11,12,13,]
Lock by[9],Waiting by[11,12,13,]
Lock by[9],Waiting by[11,12,13,]
Lock by[9],Waiting by[11,12,13,]
Lock by[9],Waiting by[11,12,13,]
Lock by[9],Waiting by[11,12,13,]
Lock by[9],Waiting by[11,12,13,]
Lock by[9],Waiting by[11,12,13,]
Lock by[11],Waiting by[12,13,]
Lock by[11],Waiting by[12,13,]
Lock by[11],Waiting by[12,13,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[11],Waiting by[12,13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[12],Waiting by[13,9,]
Lock by[13],Waiting by[9,]
Lock by[13],Waiting by[9,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[13],Waiting by[9,12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[9],Waiting by[12,]
Lock by[12],Waiting by[]
Lock by[12],Waiting by[]
Lock by[12],Waiting by[]
Lock by[12],Waiting by[]
Lock by[12],Waiting by[]
Lock by[12],Waiting by[]
Lock by[12],Waiting by[]
Lock by[12],Waiting by[]
Lock by[12],Waiting by[]
Lock by[12],Waiting by[]
Lock by[12],Waiting by[]
Lock by[12],Waiting by[]
Lock by[12],Waiting by[]
Lock by[12],Waiting by[]
Lock by[12],Waiting by[]
Lock by[12],Waiting by[]
Lock by[12],Waiting by[]
Lock by[12],Waiting by[]
Lock by[12],Waiting by[]
Lock by[12],Waiting by[]
cost:117 ms
View Code

  公平性鎖的測試結果,cost:193 ms

Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[14],Waiting by[]
Lock by[15],Waiting by[]
Lock by[14],Waiting by[15,]
Lock by[15],Waiting by[14,]
Lock by[14],Waiting by[15,]
Lock by[15],Waiting by[14,]
Lock by[14],Waiting by[15,16,]
Lock by[15],Waiting by[16,14,]
Lock by[16],Waiting by[14,15,]
Lock by[14],Waiting by[15,16,]
Lock by[15],Waiting by[16,14,]
Lock by[16],Waiting by[14,15,]
Lock by[14],Waiting by[15,16,]
Lock by[15],Waiting by[16,14,]
Lock by[16],Waiting by[14,15,]
Lock by[14],Waiting by[15,16,]
Lock by[15],Waiting by[16,14,]
Lock by[16],Waiting by[14,15,]
Lock by[14],Waiting by[15,16,]
Lock by[15],Waiting by[16,14,]
Lock by[16],Waiting by[14,15,]
Lock by[14],Waiting by[15,16,]
Lock by[15],Waiting by[16,14,]
Lock by[16],Waiting by[14,15,]
Lock by[14],Waiting by[15,16,]
Lock by[15],Waiting by[16,14,]
Lock by[16],Waiting by[14,15,]
Lock by[14],Waiting by[15,16,]
Lock by[15],Waiting by[16,14,]
Lock by[16],Waiting by[14,]
Lock by[14],Waiting by[15,16,]
Lock by[15],Waiting by[16,14,]
Lock by[16],Waiting by[14,15,]
Lock by[14],Waiting by[15,16,]
Lock by[15],Waiting by[16,14,]
Lock by[16],Waiting by[14,15,]
Lock by[14],Waiting by[15,16,]
Lock by[15],Waiting by[16,14,]
Lock by[16],Waiting by[14,15,]
Lock by[14],Waiting by[15,16,]
Lock by[15],Waiting by[16,14,]
Lock by[16],Waiting by[14,15,]
Lock by[14],Waiting by[15,16,]
Lock by[15],Waiting by[16,17,14,]
Lock by[16],Waiting by[17,14,15,]
Lock by[17],Waiting by[14,15,16,]
Lock by[14],Waiting by[15,16,17,]
Lock by[15],Waiting by[16,17,14,]
Lock by[16],Waiting by[17,14,15,]
Lock by[17],Waiting by[14,15,16,]
Lock by[14],Waiting by[15,16,17,]
Lock by[15],Waiting by[16,17,14,]
Lock by[16],Waiting by[17,14,15,]
Lock by[17],Waiting by[14,15,16,]
Lock by[14],Waiting by[15,16,17,]
Lock by[15],Waiting by[16,17,14,]
Lock by[16],Waiting by[17,14,15,]
Lock by[17],Waiting by[14,15,16,]
Lock by[14],Waiting by[15,16,17,]
Lock by[15],Waiting by[16,17,14,]
Lock by[16],Waiting by[17,14,15,]
Lock by[17],Waiting by[14,15,16,]
Lock by[14],Waiting by[15,16,17,]
Lock by[15],Waiting by[16,17,14,]
Lock by[16],Waiting by[17,14,15,]
Lock by[17],Waiting by[14,15,16,]
Lock by[14],Waiting by[15,16,17,]
Lock by[15],Waiting by[16,17,14,]
Lock by[16],Waiting by[17,14,15,]
Lock by[17],Waiting by[14,15,16,]
Lock by[14],Waiting by[15,16,]
Lock by[15],Waiting by[16,17,14,]
Lock by[16],Waiting by[17,14,15,]
Lock by[17],Waiting by[14,15,16,]
Lock by[14],Waiting by[15,16,17,]
Lock by[15],Waiting by[16,17,14,]
Lock by[16],Waiting by[17,14,15,]
Lock by[17],Waiting by[14,15,16,]
Lock by[14],Waiting by[15,16,17,]
Lock by[15],Waiting by[16,17,14,]
Lock by[16],Waiting by[17,14,15,]
Lock by[17],Waiting by[14,15,16,]
Lock by[14],Waiting by[15,16,17,]
Lock by[15],Waiting by[16,17,14,]
Lock by[16],Waiting by[17,14,15,]
Lock by[17],Waiting by[14,15,16,]
Lock by[14],Waiting by[15,16,17,]
Lock by[15],Waiting by[16,17,14,]
Lock by[16],Waiting by[17,14,15,]
Lock by[17],Waiting by[14,15,16,]
Lock by[14],Waiting by[15,16,17,]
Lock by[15],Waiting by[16,17,14,]
Lock by[16],Waiting by[17,14,15,]
Lock by[17],Waiting by[14,15,16,]
Lock by[14],Waiting by[15,16,17,]
Lock by[15],Waiting by[16,17,14,]
Lock by[16],Waiting by[17,14,15,]
Lock by[17],Waiting by[14,15,16,]
Lock by[14],Waiting by[15,16,17,]
Lock by[15],Waiting by[16,17,14,]
Lock by[16],Waiting by[17,14,15,]
Lock by[17],Waiting by[14,15,16,]
Lock by[14],Waiting by[15,16,17,]
Lock by[15],Waiting by[16,17,14,]
Lock by[16],Waiting by[17,14,15,]
Lock by[17],Waiting by[14,15,16,]
Lock by[14],Waiting by[15,16,17,]
Lock by[15],Waiting by[16,17,14,]
Lock by[16],Waiting by[17,14,15,]
Lock by[17],Waiting by[14,15,16,]
Lock by[14],Waiting by[15,16,17,]
Lock by[15],Waiting by[16,17,14,]
Lock by[16],Waiting by[17,14,15,]
Lock by[17],Waiting by[14,15,16,]
Lock by[14],Waiting by[15,16,18,17,]
Lock by[15],Waiting by[16,18,17,14,]
Lock by[16],Waiting by[18,17,14,15,]
Lock by[18],Waiting by[17,14,15,16,]
Lock by[17],Waiting by[14,15,16,18,]
Lock by[14],Waiting by[15,16,18,17,]
Lock by[15],Waiting by[16,18,17,14,]
Lock by[16],Waiting by[18,17,14,15,]
Lock by[18],Waiting by[17,14,15,16,]
Lock by[17],Waiting by[14,15,16,18,]
Lock by[14],Waiting by[15,16,18,17,]
Lock by[15],Waiting by[16,18,17,14,]
Lock by[16],Waiting by[18,17,14,15,]
Lock by[18],Waiting by[17,14,15,16,]
Lock by[17],Waiting by[14,15,16,18,]
Lock by[14],Waiting by[15,16,18,17,]
Lock by[15],Waiting by[16,18,17,14,]
Lock by[16],Waiting by[18,17,14,15,]
Lock by[18],Waiting by[17,14,15,16,]
Lock by[17],Waiting by[14,15,16,18,]
Lock by[14],Waiting by[15,16,18,17,]
Lock by[15],Waiting by[16,18,17,14,]
Lock by[16],Waiting by[18,17,14,15,]
Lock by[18],Waiting by[17,14,15,16,]
Lock by[17],Waiting by[14,15,16,18,]
Lock by[14],Waiting by[15,16,18,17,]
Lock by[15],Waiting by[16,18,17,14,]
Lock by[16],Waiting by[18,17,14,15,]
Lock by[18],Waiting by[17,14,15,16,]
Lock by[17],Waiting by[14,15,16,18,]
Lock by[14],Waiting by[15,16,18,17,]
Lock by[15],Waiting by[16,18,17,14,]
Lock by[16],Waiting by[18,17,14,15,]
Lock by[18],Waiting by[17,14,15,16,]
Lock by[17],Waiting by[14,15,16,18,]
Lock by[14],Waiting by[15,16,18,17,]
Lock by[15],Waiting by[16,18,17,14,]
Lock by[16],Waiting by[18,17,14,15,]
Lock by[18],Waiting by[17,14,15,16,]
Lock by[17],Waiting by[14,15,16,18,]
Lock by[14],Waiting by[15,16,18,17,]
Lock by[15],Waiting by[16,18,17,14,]
Lock by[16],Waiting by[18,17,14,15,]
Lock by[18],Waiting by[17,14,15,16,]
Lock by[17],Waiting by[14,15,16,18,]
Lock by[14],Waiting by[15,16,18,17,]
Lock by[15],Waiting by[16,18,17,14,]
Lock by[16],Waiting by[18,17,14,15,]
Lock by[18],Waiting by[17,14,15,16,]
Lock by[17],Waiting by[14,15,16,18,]
Lock by[14],Waiting by[15,16,18,17,]
Lock by[15],Waiting by[16,18,17,14,]
Lock by[16],Waiting by[18,17,14,15,]
Lock by[18],Waiting by[17,14,15,16,]
Lock by[17],Waiting by[14,15,16,18,]
Lock by[14],Waiting by[15,16,18,17,]
Lock by[15],Waiting by[16,18,17,14,]
Lock by[16],Waiting by[18,17,14,15,]
Lock by[18],Waiting by[17,14,15,16,]
Lock by[17],Waiting by[14,15,16,18,]
Lock by[14],Waiting by[15,16,18,17,]
Lock by[15],Waiting by[16,18,17,14,]
Lock by[16],Waiting by[18,17,14,15,]
Lock by[18],Waiting by[17,14,15,16,]
Lock by[17],Waiting by[14,15,16,18,]
Lock by[14],Waiting by[15,16,18,17,]
Lock by[15],Waiting by[16,18,17,14,]
Lock by[16],Waiting by[18,17,14,15,]
Lock by[18],Waiting by[17,14,15,16,]
Lock by[17],Waiting by[14,15,16,18,]
Lock by[14],Waiting by[15,16,18,17,]
Lock by[15],Waiting by[16,18,17,14,]
Lock by[16],Waiting by[18,17,14,15,]
Lock by[18],Waiting by[17,14,15,16,]
Lock by[17],Waiting by[14,15,16,18,]
Lock by[14],Waiting by[15,16,18,17,]
Lock by[15],Waiting by[16,18,17,14,]
Lock by[16],Waiting by[18,17,14,15,]
Lock by[18],Waiting by[17,14,15,16,]
Lock by[17],Waiting by[14,15,16,18,]
Lock by[14],Waiting by[15,16,18,17,]
Lock by[15],Waiting by[16,18,17,14,]
Lock by[16],Waiting by[18,17,14,15,]
Lock by[18],Waiting by[17,14,15,]
Lock by[17],Waiting by[14,15,18,]
Lock by[14],Waiting by[15,18,17,]
Lock by[15],Waiting by[18,17,14,]
Lock by[18],Waiting by[17,14,15,]
Lock by[17],Waiting by[14,15,18,]
Lock by[14],Waiting by[15,18,17,]
Lock by[15],Waiting by[18,17,14,]
Lock by[18],Waiting by[17,14,15,]
Lock by[17],Waiting by[14,15,16,18,]
Lock by[14],Waiting by[15,16,18,17,]
Lock by[15],Waiting by[16,18,17,14,]
Lock by[16],Waiting by[18,17,14,15,]
Lock by[18],Waiting by[17,14,15,16,]
Lock by[17],Waiting by[14,15,16,18,]
Lock by[14],Waiting by[15,16,18,17,]
Lock by[15],Waiting by[16,18,17,14,]
Lock by[16],Waiting by[18,17,14,15,]
Lock by[18],Waiting by[17,14,15,16,]
Lock by[17],Waiting by[14,15,16,18,]
Lock by[14],Waiting by[15,16,18,17,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,]
Lock by[18],Waiting by[17,16,]
Lock by[17],Waiting by[16,18,]
Lock by[16],Waiting by[18,17,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,15,]
Lock by[18],Waiting by[17,15,16,]
Lock by[17],Waiting by[15,16,18,]
Lock by[15],Waiting by[16,18,17,]
Lock by[16],Waiting by[18,17,]
Lock by[18],Waiting by[17,16,]
Lock by[17],Waiting by[16,18,]
Lock by[16],Waiting by[18,17,]
Lock by[18],Waiting by[17,16,]
Lock by[17],Waiting by[16,18,]
Lock by[16],Waiting by[18,17,]
Lock by[18],Waiting by[17,16,]
Lock by[17],Waiting by[16,18,]
Lock by[16],Waiting by[18,17,]
Lock by[18],Waiting by[17,16,]
Lock by[17],Waiting by[16,18,]
Lock by[16],Waiting by[18,17,]
Lock by[18],Waiting by[17,]
Lock by[17],Waiting by[18,]
Lock by[18],Waiting by[17,]
Lock by[17],Waiting by[18,]
Lock by[18],Waiting by[17,]
Lock by[17],Waiting by[18,]
Lock by[18],Waiting by[17,]
Lock by[17],Waiting by[18,]
Lock by[18],Waiting by[17,]
Lock by[17],Waiting by[18,]
Lock by[18],Waiting by[17,]
Lock by[17],Waiting by[18,]
Lock by[18],Waiting by[17,]
Lock by[17],Waiting by[18,]
Lock by[18],Waiting by[17,]
Lock by[17],Waiting by[18,]
Lock by[18],Waiting by[17,]
Lock by[17],Waiting by[18,]
Lock by[18],Waiting by[17,]
Lock by[17],Waiting by[18,]
Lock by[18],Waiting by[17,]
Lock by[17],Waiting by[18,]
Lock by[18],Waiting by[]
Lock by[18],Waiting by[]
Lock by[18],Waiting by[]
Lock by[18],Waiting by[]
Lock by[18],Waiting by[]
Lock by[18],Waiting by[]
Lock by[18],Waiting by[]
Lock by[18],Waiting by[]
Lock by[18],Waiting by[]
Lock by[18],Waiting by[]
Lock by[18],Waiting by[]
Lock by[18],Waiting by[]
Lock by[18],Waiting by[]
Lock by[18],Waiting by[]
Lock by[18],Waiting by[]
Lock by[18],Waiting by[]
Lock by[18],Waiting by[]
Lock by[18],Waiting by[]
cost:193 ms
View Code

 

五 讀寫鎖

   讀寫鎖維護了一對鎖,一個讀鎖和一個寫鎖,經過分離讀鎖和寫鎖,使得併發性相比通常的排他鎖(同一時刻只容許一個線程進行訪問)有了很大的提高。

  下面咱們看下它有啥特性:

特性

說明

公平性選擇

支持非公平(默認)和公平的所獲取方式,吞吐量仍是非公平優於公平

可重入

該鎖支持可重進入。

讀線程在獲取了讀鎖以後可以再次獲取讀鎖。

寫線程在獲取了寫鎖以後可以再次獲取寫鎖。

鎖降級

遵循獲取寫鎖、獲取讀鎖在釋放寫鎖的次序,寫鎖可以降級成讀鎖。

排他性

當寫線程訪問時,其餘讀寫線程均被阻塞

  另外讀寫鎖是採起一個整型變量來維護多種狀態。高16位表示讀,低16位表示寫。

// 偏移位
static final int SHARED_SHIFT   = 16;
static final int SHARED_UNIT    = (1 << SHARED_SHIFT);
// 讀寫線程容許佔用的最大數
static final int MAX_COUNT      = (1 << SHARED_SHIFT) - 1;
// 獨佔標誌
static final int EXCLUSIVE_MASK = (1 << SHARED_SHIFT) - 1;

  下面從源碼中找出這些特性,先看下寫鎖的實現:

 1 protected final boolean tryAcquire(int acquires) {
 2 
 3     Thread current = Thread.currentThread();
 4     int c = getState();
 5     // 表示獨佔個數,也就是與低16爲進行與運算。
 6     int w = exclusiveCount(c);
 7     if (c != 0) {
 8         // c!=0 且 w==0表示不存在寫線程,但存在讀線程
 9         if (w == 0 || current != getExclusiveOwnerThread())
10             return false;
11         if (w + exclusiveCount(acquires) > MAX_COUNT)
12             throw new Error("Maximum lock count exceeded");
13         /**
14          * 獲取寫鎖的條件:
15          * 不能存在讀線程且當前線程是當前佔用鎖的線程(這裏體現可重入性和排他性);
16          * 當前佔用鎖的次數不能超過最大數
17          */
18         setState(c + acquires);
19         return true;
20     }
21     if (writerShouldBlock() ||
22             !compareAndSetState(c, c + acquires))
23         return false;
24     setExclusiveOwnerThread(current);
25     return true;
26 }
27 static int exclusiveCount(int c) { return c & EXCLUSIVE_MASK; }

  獲取讀鎖源碼以下:

protected final int tryAcquireShared(int unused) {
    Thread current = Thread.currentThread();
    int c = getState();
    /**
     * exclusiveCount(c) != 0: 表示有寫線程在佔用
     * getExclusiveOwnerThread() != current :  當前佔用鎖的線程不是當前線程。
     * 若是上面兩個條件同時知足,則獲取失敗。
     * 上面代表若是當前線程是擁有寫鎖的線程能夠獲取讀鎖(體現可重入和鎖降級)。
     */
    if (exclusiveCount(c) != 0 &&
            getExclusiveOwnerThread() != current)
        return -1;
    int r = sharedCount(c);
    if (!readerShouldBlock() &&
            r < MAX_COUNT &&
            compareAndSetState(c, c + SHARED_UNIT)) {
        if (r == 0) {
            firstReader = current;
            firstReaderHoldCount = 1;
        } else if (firstReader == current) {
            firstReaderHoldCount++;
        } else {
            HoldCounter rh = cachedHoldCounter;
            if (rh == null || rh.tid != getThreadId(current))
                cachedHoldCounter = rh = readHolds.get();
            else if (rh.count == 0)
                readHolds.set(rh);
            rh.count++;
        }
        return 1;
    }
    return fullTryAcquireShared(current);
}
相關文章
相關標籤/搜索