ReentrantLockの
ReentrantLockの(軽量ロック)も、オブジェクトロック、リエントラントロックミューテックスを呼び出すことができます。ヘビー級のロックを同期、JDK初期のバージョンでは、同期バイアスされ、ロックJDK1.5、軽量かつヘビー級ロックロックの導入後、速く同期よりもロックします。パフォーマンスは、ロックの他の種類は、人々は、参照この論文の違いについて教えてくださいとのtryLockをロックしたいことと一致しました。
ロックVSのtryLock
1つの 公共 ボイドロック(){ 2 sync.lock()。 3 } 4 5 公共 ボイド lockInterruptibly()スローInterruptedExceptionあるが{ 6 sync.acquireInterruptibly(1 )。 7 } 8 9 10 11 パブリック ブールのtryLock(){ 12 リターン sync.nonfairTryAcquire(1 )。 13 } 14 15 16 パブリック ブールのtryLock(長いタイムアウト、TimeUnitでユニット) 17は、 スローInterruptedExceptionある{ 18 リターン sync.tryAcquireNanos(1 、unit.toNanos(タイムアウト))。 19 }
次のように一つの例は次のとおりです。
スレッド場合A
やスレッドがB
同じロックを使用するためにLOCK
、最初の取得にロックをスレッドLOCK.lock()
し、常に解放されないままにします。この時点でロックを獲得するためにBに移動した場合は、4つの方法があります。
-
LOCK.lock()
:このアプローチは、常に、待ちになります呼び出しがあってもB.interrupt()
、スレッドの呼び出しはしていない限り、中断することができないLOCK.unlock()
ロックを解除します。 -
LOCK.lockInterruptibly()
:このアプローチは待機します、しかし、コールは時にB.interrupt()
待つように中断され、そしてスローInterruptedException
例外を、それ以外の場合はlock()
Aがロックを解放するスレッドまで待つにはいつもと同じ。 -
LOCK.tryLock()
:、そこ待機しません以下のロックや偽ダイレクトリターンを得る次のロジックを実行するために、。 -
LOCK.tryLock(10, TimeUnit.SECONDS)
:そこの時間待ちの10秒以内になりますが、コールは時にB.interrupt()
待つと投げるために中断されますInterruptedException
。スレッドAがロックを解除する場合は、10秒以内に、ロックを取得し、trueを返しますされ、それ以外の場合は、ロックした後、10秒未満を取得し、次のロジックを実行するために、falseを返します。
ロックとのtryLockの違い
1:ロックロックが待機します取得していません。tryLockがしようとしているリターンが真取得するには、虚偽のリターンを得ます。
2:のtryLockを中断することができ、中断し、ロックができません。