javaの同時ロックの-ReentrantLockとlockInterruptiblyの違い

ロック方法ReentrantLockのロック()ロック、lockInterruptibly()は割り込みロック取得モードを提供無条件ポーリング取得する方法を提供します。その中にこれらの2つの方法の違いはどこにありますか?直接割り込みを処理するために、上部発信者領域によってスローされた例外を中断しlockInterruptibly();監視状態が中断すると、ロックが割り込み要求のデフォルトメソッドを処理知ることができるソースコードを分析することによって、現在のスレッドに割り込みます。

1つのロック操作

         成功したロックを取得した後、中断を無視して、ロック獲得処理をロックして、割り込みを処理割り込みを識別、すなわちselfInterruptは自分自身を中断しました。次のように操作ソースを取得します。

/ **

  *デフォルトの割り込み処理がselfInterruptです

 * /  

パブリック最終ボイド取得(INTのarg){  

(もし!tryAcquire(引数)&&  

        acquireQueued(addWaiter(Node.EXCLUSIVE)、引数))  

        selfInterrupt();  

}  

      acquireQueuedは、ループのために無条件でロックが成功したスレッドの割り込みステータスを返して、取得されるまでロックを取得再試行してください。この方法は通常のためにフォロースルーを返し、ロックを取得することに成功しなければなりません。

/ **

 *無条件の成功戻るまで再試行、レコード割り込みステータス

 * /  

最終的なブールacquireQueued(最終ノードノード、int型の引数){  

ブール値は=真失敗しました。  

{試します  

ブールが= falseを中断しました。  

ために (;;) {  

最終ノードp = node.predecessor()。  

もし(P ==ヘッド&& tryAcquire(引数)){  

                setHead(ノード)。  

p.next = NULL; //ヘルプGC  

= falseを失敗しました。  

リターンが中断します。  

            }  

IF(shouldParkAfterFailedAcquire(P、ノード)&&  

                parkAndCheckInterrupt())  

真=中断。  

        }  

}最後に {  

(失敗した)場合  

            cancelAcquire(ノード)。  

    }  

}  

2 lockInterruptibly操作

     直接ロック獲得処理の割り込みステータスを扱うのではなく、割り込み可能ロックは、割り込みを処理するために、上の発信者によってスローされた例外を中断します。ロック取得コードのこの部分は、この方法は、2つの方法があることacquireQueue差を返すことソースのニュアンスは、一方は、通常、ロックが取得され、サイクルの終わりのためのものである。割り込み要求が検出された後に他のスレッドがウェイクアップし、次いですぐに割り込み例外がスローされ、操作は、メソッドの最後につながりました。

/ **

     *排他割り込みモードで取得します。

     acquireの引数argを* @param

     * /  

プライベート無効doAcquireInterruptibly(int型引数)  

InterruptedExceptionが{スロー  

最終ノードノード= addWaiter(Node.EXCLUSIVE)。  

ブール値は=真失敗しました。  

{試します  

ために (;;) {  

最終ノードp = node.predecessor()。  

もし(P ==ヘッド&& tryAcquire(引数)){  

                    setHead(ノード)。  

p.next = NULL; //ヘルプGC  

= falseを失敗しました。  

返します。  

                }  

IF(shouldParkAfterFailedAcquire(P、ノード)&&  

                    parkAndCheckInterrupt())  

新しい例外:InterruptedExceptionを投げます();  

            }  

}最後に {  

(失敗した)場合  

                cancelAcquire(ノード)。  

        }  

    }  

     結論:割り込みと非割り込みロックモードReentrantLockの違いは次のとおりです。スレッドが別のスレッドによって中断された場合、スレッドはロック操作が失敗した取得しようと、待機中のプロセスは、それが割り込み要求に応答する方法です。ロックの方法は、それが成功するまでロックを獲得し続けて、割込み要求を無視し、そしてlockInterruptibly例外は、直接すぐに割り込みを処理するために、上の発信者によって中断応えスロー割り込み。

     なぜ、その後、二つのモードに分けてすべきですか?どちらも、どのような機会それやり方をロックするために適していますか?操作が中断されているため)によると、私は(ロックを考えて理解し、その意味的なロック取得操作を中断による影響を受けない場合にも適用すること、そして、あなたが通常の実行ロック操作を中断無視することができるだけにThread.currentThreadて(状態を記録().INTERRUPT()操作が、真実である、)割り込みに応答しなかった割り込みの状態に戻りました。必要な操作が中断された場合、スレッドはもう返しませんが、競争ロックすぐにキャンセルとロック取得動作(cancelAcquireでようやくすなわち操作)に参加し、割り込み要求を検出すると、lockInterruptiblyメソッドを使用する必要があり、この時点で、参加ロックを競うことができません

おすすめ

転載: www.cnblogs.com/zqyanywn/p/11646451.html