Java併發程式設計(3) JUC中的鎖
一 前言
前面已經說到JUC中的鎖主要是基於AQS實現,而AQS(AQS的內部結構 、AQS的設計與實現)在前面已經簡單介紹過了。今天記錄下JUC包下的鎖是怎麼基於AQS上實現的
二 同步鎖
同步鎖不是JUC中的鎖但也順便提下,它是由synchronized 關鍵字進行同步,實現對競爭資源互斥訪問的鎖。
同步鎖的原理:對於每一個物件,有且僅有一個同步鎖;不同的執行緒能共同訪問該同步鎖。在同一個時間點該同步鎖能且只能被一個執行緒獲取到,其他執行緒都得等待。
另外:synchronized是Java中的關鍵字且是內建的語言實現;它是在JVM層面上實現的,不但可以通過一些監控工具監控synchronized的鎖定,而且在程式碼執行時出現異常,JVM會自動釋放鎖定;synchronized等待的執行緒會一直等待下去,不能響應中斷。
三 JUC中的鎖結構
相比同步鎖,JUC包中的鎖的功能更加強大,它為鎖提供了一個框架,該框架允許更靈活地使用鎖(它由自己實現、需要手動釋放鎖、能響應中斷、可以多執行緒跑提高效率等)。下圖是根據原始碼中查出畫的類圖,便知它提供的鎖有好幾種,下面一一分析。
四 可重入鎖-ReentrantLock
重入鎖ReentrantLock,顧名思義:就是支援重進入的鎖,它表示該鎖能夠支援一個執行緒對資源的重複加鎖。另外該鎖孩紙獲取鎖時的公平和非公平性選擇,所以它包含公平鎖與非公平鎖(它們兩也可以叫可重入鎖)。首先提出兩個疑問:它怎麼實現重進入呢?釋放邏輯還跟AQS中一樣嗎?
非公平鎖
finalboolean 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,表示獲取同步狀態成功。
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,則表示有執行緒比當前執行緒更早地請求獲取鎖,因此需要等待前驅執行緒獲取並釋放鎖之後才能繼續獲取鎖。
公平鎖與非公平鎖的區別
從上面原始碼中得知,公平性鎖保證了鎖的獲取按照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 msView 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相關推薦
Java併發程式設計(3) JUC中的鎖
一 前言 前面已經說到JUC中的鎖主要是基於AQS實現,而AQS(AQS的內部結構 、AQS的設計與實現)在前面已經簡單介紹過了。今天記錄下JUC包下的鎖是怎麼基於AQS上實現的 二 同步鎖 同步鎖不是JUC中的鎖但也順便提下,它是由synchronized 關鍵字進行同步,實現對競爭資源
Java併發程式設計3 —— 物件鎖和類鎖
synchronized關鍵字作用在同步程式碼塊上,給共享變數“上鎖”可以解決執行緒安全問題。這把“鎖”可以作用在某個物件上,也可以作用在某個類上。 舉個栗子,有個自助銀行,裡面有兩臺ATM機,工作人員可以看到每次存取款之後機器裡鈔票的總金額數。現在有兩個人來存錢,各存50
Java併發程式設計(10)-顯式鎖和讀寫鎖的使用
文章目錄 一、顯式鎖 1.1、什麼是顯式鎖 1.2、Lock和ReentrantLock 1.3、如何使用顯示鎖 二、讀寫鎖 2.1、為什麼使用讀寫鎖
Java併發程式設計(3)-構造執行緒安全類的模式
文章目錄 一、例項限制模式 1.1、 限制變數確保執行緒安全 1.2、分析ArrayList的執行緒安全性 1.3、總結 二、委託執行緒安全模式 2.
Java併發程式設計——ReentrantLock重入鎖解析
重入鎖 所謂重入鎖,即支援重入性,表示能夠對共享資源重複加鎖,即當前執行緒獲取該鎖再次獲取不會被阻塞。 重入性 線上程獲取鎖的時候,如果已經獲取鎖的執行緒是當前執行緒的話則直接再次獲取成功; 由於鎖會被獲取n次,那麼只有鎖在被釋放同樣的n次之後,該鎖才算是完全釋
Java併發程式設計實戰 03互斥鎖 解決原子性問題
# 文章系列 [Java併發程式設計實戰 01併發程式設計的Bug源頭](https://mp.weixin.qq.com/s/QT44HS47l_ir08pCZeFU5Q) [Java併發程式設計實戰 02Java如何解決可見性和有序性問題](https://mp.weixin.qq.com/s/Ryu
Java併發程式設計實戰 04死鎖了怎麼辦?
# Java併發程式設計文章系列 [Java併發程式設計實戰 01併發程式設計的Bug源頭](https://mp.weixin.qq.com/s/QT44HS47l_ir08pCZeFU5Q) [Java併發程式設計實戰 02Java如何解決可見性和有序性問題](https://mp.weixin.qq
Java併發程式設計(05):悲觀鎖和樂觀鎖機制
本文原始碼:[GitHub·點這裡](https://github.com/cicadasmile/java-base-parent) || [GitEE·點這裡](https://gitee.com/cicadasmile/java-base-parent) # 一、資源和加鎖 ## 1、場景描述
Java併發程式設計的藝術之五----java中的鎖
1.Lock介面 鎖是用來控制多個執行緒訪問共享資源的方式,一般來說,一個鎖能夠防止多個執行緒同時訪問共享資源(但是有些鎖可以允許多個執行緒併發的訪問共享資源,比如讀寫鎖)。Java SE 5之後,併發包中新增了Lock介面(以及相關實現類)用來實現鎖功能,在使用時需要顯式地獲取和釋放鎖。雖然它
【搞定Java併發程式設計】第14篇:Java中鎖的概述
上一篇:重排序:https://blog.csdn.net/pcwl1206/article/details/84930669 1、Lock介面 鎖是用來控制多個執行緒訪問共享資源的方式,一般來說,一個鎖能夠防止多個執行緒同時訪問共享資源(但有些鎖可以允許多個執行緒併發訪問共享資源,比如:讀
《Java併發程式設計的藝術》-Java併發包中的讀寫鎖及其實現分析
1. 前言 在Java併發包中常用的鎖(如:ReentrantLock),基本上都是排他鎖,這些鎖在同一時刻只允許一個執行緒進行訪問,而讀寫鎖在同一時刻可以允許多個讀執行緒訪問,但是在寫執行緒訪問時,所有的讀執行緒和其他寫執行緒均被阻塞。讀寫鎖維護了一對鎖,一個讀鎖和一個寫鎖,通過分離讀鎖和
Java併發程式設計札記-(四)JUC鎖-08CountDownLatch
CountDownLatch是一個通用同步器,用於同步一個或多個任務。在完成一組正在其他執行緒中執行的任務之前,它允許一個或多個執行緒一直等待。 可以用一個初始計數值來初始化CountDownLatch物件,任何在這個物件上呼叫wait()的方法都將阻塞,直至
Java併發程式設計札記-(四)JUC鎖-04Condition簡介
我們已經學習瞭如何通過使用鎖來同步兩個任務,但為了解決某個問題,任務之間只有互斥是不夠的,還需要相互通訊,相互協作。今天就來學習如何實現任務之間的協作。 初識Condition 在任務協作中,關鍵問題是任務之間的通訊。握手可以通過Object的監視器方法(w
Java併發程式設計札記-(四)JUC鎖-01概述
今天來學習JUC鎖。JUC鎖位於java.util.concurrent.locks包下,為鎖和等待條件提供一個框架,它不同於內建同步和監視器。 參考JDK1.8的java.util.concurrent.locks包,畫出如下圖: CountDown
Java併發程式設計札記-(四)JUC鎖-10Semaphore簡介
一般的鎖在任意時刻只允許一個執行緒訪問一項資源,而計數訊號量允許n個任務同時訪問一項資源。我們可以將訊號量看做一個許可集,可以向執行緒分發使用資源的許可證。獲得資源前,執行緒呼叫acquire()從許可集中獲取許可。該執行緒結束後,通過release()將許可還
Java併發程式設計札記-(四)JUC鎖-02Lock與ReentrantLock
今天學習Lock與ReentrantLock。 Java中的鎖有兩種,synchronized與Lock。因為使用synchronized並不需要顯示地加鎖與解鎖,所以往往稱synchronized為隱式鎖,而使用Lock時則相反,所以一般稱Lock為顯示鎖。
Java併發程式設計札記-(四)JUC鎖-07讀寫鎖的升級—StampedLock
StampedLock是JDK1.8新增的一個鎖,是對讀寫鎖ReentrantReadWriteLock的改進。前面已經學習了ReentrantReadWriteLock,我們瞭解到,在共享資料很大,且讀操作遠多於寫操作的情況下,ReentrantReadWri
Java併發程式設計札記-(四)JUC鎖-09CyclicBarrier
CyclicBarrier允許一組執行緒互相等待,直到到達某個公共屏障點。如果你希望一組並行的任務在下個步驟之前相互等待,直到所有的任務都完成了下個步驟前的所有操作,才繼續向前執行,那麼CyclicBarrier很合適。 函式列表 //構造方法摘要 Cy
java併發程式設計應用易忘知識點(1)java中的鎖
Lock介面 Java se5之後,出現了Lock介面,提供了與Synchronized類似同步功能。與synchronized相比,他雖然少了隱式獲取釋放鎖的便捷性,卻擁有了鎖獲取與釋放的可操作性、可中斷的獲取鎖以及超時獲取鎖等多種synchronized不具備的同步特性
java併發程式設計(三)--java中的鎖(Lock介面和佇列同步器AQS)
public abstract class AbstractQueuedSynchronizer extends AbstractOwnableSynchronizer implements java.io.Serializable { //內部類--節點 static final clas