AQSの例分析


https://blog.csdn.net/AAA821/article/details/79712522このブログでは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を使うのかは、同時制御をしたいからにほかならない.