AQSの例分析
2324 ワード
https://blog.csdn.net/AAA821/article/details/79712522このブログではAQSを紹介しています
それからアリDruidのソースコードを見て、その中の1つの方法を挙げてAQSの作用を説明して、例を通じてもっとよくAQSの作用を理解することができます
これはSimpleCanalConnectorの接続方法です.
次はBooleanMutexのget()メソッドです
次はSyncのinnerGet()メソッドです
次はAbstractQueuedSynchronizerのacquireSharedInterruptibly
このメソッドチェーンの呼び出しは,接続前にAbstractQueuedSynchronizerのacquireSharedInterruptiblyメソッドを呼び出し,まずロックを取得しなくてもよいと判断する(tryAcquireSharedが共有ロックを取得しようと試みる)
1.ロックを取得できれば、このスレッドをブロックする必要はありません.
2.ロックが取得されない場合は、doAcquireSharedInterruptiblyメソッドを呼び出してスレッドをNodeにカプセル化してQueueに格納し、ロックを取得するスレッドがロックを解除するのを待っていると、ロックが起動し、ブロックが終了します.
なぜ接続方法がAQSを使うのかは、同時制御をしたいからにほかならない.
それからアリDruidのソースコードを見て、その中の1つの方法を挙げてAQSの作用を説明して、例を通じてもっとよくAQSの作用を理解することができます
これはSimpleCanalConnectorの接続方法です.
public void connect() throws CanalClientException {
if (connected) {
return;
}
if (runningMonitor != null) {
if (!runningMonitor.isStart()) {
runningMonitor.start();
}
} else {
waitClientRunning();// Sync
doConnect();
if (filter != null) {
subscribe(filter);
}
if (rollbackOnConnect) {
rollback();
}
}
connected = true;
}
private void waitClientRunning() {
try {
if (zkClientx != null) {
if (!connected) {// connect
throw new CanalClientException("should connect first");
}
mutex.get();// mutex = BooleanMutex
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
throw new CanalClientException(e);
}
}
次はBooleanMutexのget()メソッドです
/**
* Boolean true
*
* @throws InterruptedException
*/
public void get() throws InterruptedException {
sync.innerGet(); //sync = Sync
}
次はSyncのinnerGet()メソッドです
void innerGet() throws InterruptedException {
acquireSharedInterruptibly(0);
}
次はAbstractQueuedSynchronizerのacquireSharedInterruptibly
public final void acquireSharedInterruptibly(int arg)
throws InterruptedException {
if (Thread.interrupted())
throw new InterruptedException();
if (tryAcquireShared(arg) < 0)
doAcquireSharedInterruptibly(arg);
}
このメソッドチェーンの呼び出しは,接続前にAbstractQueuedSynchronizerのacquireSharedInterruptiblyメソッドを呼び出し,まずロックを取得しなくてもよいと判断する(tryAcquireSharedが共有ロックを取得しようと試みる)
1.ロックを取得できれば、このスレッドをブロックする必要はありません.
2.ロックが取得されない場合は、doAcquireSharedInterruptiblyメソッドを呼び出してスレッドをNodeにカプセル化してQueueに格納し、ロックを取得するスレッドがロックを解除するのを待っていると、ロックが起動し、ブロックが終了します.
なぜ接続方法がAQSを使うのかは、同時制御をしたいからにほかならない.