前面已經說到JUC中的鎖主要是基於AQS實現,而AQS(AQS的內部結構 、AQS的設計與實現)在前面已經簡單介紹過了。今天記錄下JUC包下的鎖是怎麼基於AQS上實現的html
同步鎖不是JUC中的鎖但也順便提下,它是由synchronized 關鍵字進行同步,實現對競爭資源互斥訪問的鎖。java
同步鎖的原理:對於每個對象,有且僅有一個同步鎖;不一樣的線程能共同訪問該同步鎖。在同一個時間點該同步鎖能且只能被一個線程獲取到,其餘線程都得等待。多線程
另外:synchronized是Java中的關鍵字且是內置的語言實現;它是在JVM層面上實現的,不但能夠經過一些監控工具監控synchronized的鎖定,並且在代碼執行時出現異常,JVM會自動釋放鎖定;synchronized等待的線程會一直等待下去,不能響應中斷。併發
相比同步鎖,JUC包中的鎖的功能更增強大,它爲鎖提供了一個框架,該框架容許更靈活地使用鎖(它由本身實現、須要手動釋放鎖、能響應中斷、能夠多線程跑提升效率等)。下圖是根據源碼中查出畫的類圖,便知它提供的鎖有好幾種,下面一一分析。app
重入鎖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
公平性鎖的測試結果,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
讀寫鎖維護了一對鎖,一個讀鎖和一個寫鎖,經過分離讀鎖和寫鎖,使得併發性相比通常的排他鎖(同一時刻只容許一個線程進行訪問)有了很大的提高。
下面咱們看下它有啥特性:
特性 |
說明 |
公平性選擇 |
支持非公平(默認)和公平的所獲取方式,吞吐量仍是非公平優於公平 |
可重入 |
該鎖支持可重進入。 讀線程在獲取了讀鎖以後可以再次獲取讀鎖。 寫線程在獲取了寫鎖以後可以再次獲取寫鎖。 |
鎖降級 |
遵循獲取寫鎖、獲取讀鎖在釋放寫鎖的次序,寫鎖可以降級成讀鎖。 |
排他性 |
當寫線程訪問時,其餘讀寫線程均被阻塞 |
另外讀寫鎖是採起一個整型變量來維護多種狀態。高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); }