CyclicBarrier原始碼解析
CyclicBarrier
基於可重入鎖 ReentrantLock
和 Condition
共同實現。
parties
:設定多少個執行緒或者任務等待至barrier
狀態barrierAction
:設定指定執行緒全部到達barrier
狀態時會執行的任務
public CyclicBarrier(int parties) {
}
public CyclicBarrier(int parties, Runnable barrierAction) {
}
分析 await
方法
public int await() throws InterruptedException, BrokenBarrierException {
try {
return dowait(false, 0L);
} catch (TimeoutException toe) {
throw new Error(toe); // cannot happen
}
}
private int dowait(boolean timed, long nanos)
throws InterruptedException, BrokenBarrierException,
TimeoutException {
final ReentrantLock lock = this.lock;
lock.lock(); // 獲取鎖
try {
final Generation g = generation;
// 當前generation已損壞,則丟擲異常
if (g.broken)
throw new BrokenBarrierException();
// 如果當前執行緒被中斷,則通過breakBarrier終止CyclicBarrier,喚醒CyclicBarrier中所有等待執行緒
if (Thread.interrupted()) {
breakBarrier();
throw new InterruptedException();
}
int index = --count; // 計數值自減
if (index == 0) { // 計數值為0表示已經有parties個執行緒到達barrier
boolean ranAction = false;
try {
final Runnable command = barrierCommand; // 第二個構造方法中傳遞的到達barrier需要執行的任務
if (command != null)
command.run(); // 執行到達barrier的任務
ranAction = true;
nextGeneration(); // 喚醒所有等待執行緒並更新generation
return 0;
} finally {
if (!ranAction)
breakBarrier();
}
}
// loop until tripped, broken, interrupted, or timed out
// 執行緒處於阻塞狀態,直到 parties個執行緒到達barrier 或 當前執行緒被中斷 或 超時,執行緒才繼續執行
for (;;) {
try {
// 沒有設定超時時間,使用await等待;否則使用awaitNanos等待
if (!timed)
trip.await();
else if (nanos > 0L)
nanos = trip.awaitNanos(nanos);
} catch (InterruptedException ie) {
// 如果執行緒被中斷,則喚醒所有等待執行緒
if (g == generation && ! g.broken) {
breakBarrier();
throw ie;
} else {
// We're about to finish waiting even if we had not
// been interrupted, so this interrupt is deemed to
// "belong" to subsequent execution.
Thread.currentThread().interrupt();
}
}
if (g.broken)
throw new BrokenBarrierException();
if (g != generation)
return index;
// 如果設定了超時等待 且 超時時間已到,則喚醒所有等待執行緒
if (timed && nanos <= 0L) {
breakBarrier();
throw new TimeoutException();
}
}
} finally {
lock.unlock(); // 釋放鎖
}
}
相關文章
- CyclicBarrier原始碼分析原始碼
- Java併發包原始碼學習系列:同步元件CyclicBarrier原始碼解析Java原始碼元件
- 原始碼分析:CyclicBarrier 之迴圈柵欄原始碼
- 併發程式設計之 CyclicBarrier 原始碼分析程式設計原始碼
- Java 併發程式設計(十四) -- CyclicBarrier原始碼分析Java程式設計原始碼
- Java Timer原始碼解析(定時器原始碼解析)Java原始碼定時器
- 【原始碼解析】- ArrayList原始碼解析,絕對詳細原始碼
- CountDownLatch、CyclicBarrier、Semaphore、Exchanger 的詳細解析CountDownLatch
- 07 併發工具類CountDownLatch、CyclicBarrier、Semaphore使用及原始碼分析CountDownLatch原始碼
- ReactNative原始碼解析-初識原始碼React原始碼
- Koa 原始碼解析原始碼
- Koa原始碼解析原始碼
- RxPermission原始碼解析原始碼
- Express原始碼解析Express原始碼
- redux原始碼解析Redux原始碼
- CopyOnWriteArrayList原始碼解析原始碼
- LeakCanary原始碼解析原始碼
- ArrayBlockQueue原始碼解析BloC原始碼
- ReentrantLock原始碼解析ReentrantLock原始碼
- OKio原始碼解析原始碼
- ReentrantReadWriteLock原始碼解析原始碼
- Semaphore原始碼解析原始碼
- Exchanger原始碼解析原始碼
- SDWebImage原始碼解析Web原始碼
- AbstractQueuedSynchronizer原始碼解析原始碼
- LinkedList原始碼解析原始碼
- HandlerThread原始碼解析thread原始碼
- ButterKnife原始碼解析原始碼
- SpringMVC原始碼解析SpringMVC原始碼
- RecyclerView原始碼解析View原始碼
- MyBatis原始碼解析MyBatis原始碼
- CountDownLatch原始碼解析CountDownLatch原始碼
- Promise 原始碼解析Promise原始碼
- Mansonry原始碼解析原始碼
- Observer原始碼解析Server原始碼
- SparseArray 原始碼解析原始碼
- Ribbon原始碼解析原始碼
- AsyncTask原始碼解析原始碼