上一篇 <<<AQS同步器
下一篇 >>>CountDownLatch同步計(jì)數(shù)器
Condition用法
Condition底層也是基于AQS實(shí)現(xiàn)的。
Condition是一個(gè)接口,其提供的就兩個(gè)核心方法卧须,await和signal方法轧粟。分別對(duì)應(yīng)著Object的wait和notify方法。調(diào)用Object對(duì)象的這兩個(gè)方法抒钱,需要在同步代碼塊里面最筒,即必須先獲取到鎖才能執(zhí)行這兩個(gè)方法水慨。同理,Condition調(diào)用這兩個(gè)方法叨襟,也必須先獲取到鎖
Condition的隊(duì)列
a.等待隊(duì)列:用于存放在lock鎖中調(diào)用await方法,當(dāng)前線程會(huì)變?yōu)樽枞麪顟B(tài)繁扎,
同時(shí)會(huì)釋放鎖 單向鏈表存放
b.同步隊(duì)列:用于存放沒有競爭到鎖,采用雙向鏈表存放糊闽。
關(guān)鍵代碼
public final void await() throws InterruptedException {
if (Thread.interrupted())
throw new InterruptedException();
// 將當(dāng)前節(jié)點(diǎn)添加到最后一個(gè)節(jié)點(diǎn)
Node node = addConditionWaiter();
//釋放鎖的狀態(tài)
long savedState = fullyRelease(node);
int interruptMode = 0;
while (!isOnSyncQueue(node)) {
// 如果當(dāng)前線程為-2 則當(dāng)前線程變?yōu)樽枞麪顟B(tài)
LockSupport.park(this);
if ((interruptMode = checkInterruptWhileWaiting(node)) != 0)
break;
}
//重新獲取鎖
if (acquireQueued(node, savedState) && interruptMode != THROW_IE)
interruptMode = REINTERRUPT;
if (node.nextWaiter != null) // clean up if cancelled
unlinkCancelledWaiters();
if (interruptMode != 0)
reportInterruptAfterWait(interruptMode);
}
public final void signal() {
if (!isHeldExclusively())
throw new IllegalMonitorStateException();
//獲取單向鏈表梳玫,
Node first = firstWaiter;
if (first != null)
doSignal(first);
}
相關(guān)文章鏈接:
<<<多線程基礎(chǔ)
<<<線程安全與解決方案
<<<鎖的深入化
<<<鎖的優(yōu)化
<<<Java內(nèi)存模型(JMM)
<<<Volatile解決JMM的可見性問題
<<<Volatile的偽共享和重排序
<<<CAS無鎖模式及ABA問題
<<<Synchronized鎖
<<<Lock鎖
<<<AQS同步器
<<<CountDownLatch同步計(jì)數(shù)器
<<<Semaphore信號(hào)量
<<<CyclicBarrier屏障
<<<線程池
<<<并發(fā)隊(duì)列
<<<Callable與Future模式
<<<Fork/Join框架
<<<Threadlocal
<<<Disruptor框架
<<<如何優(yōu)化多線程總結(jié)