実際の面接の質問の間アリ差2 ----内部ReentrantLockのとのtryLockをロック

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を中断することができ、中断し、ロックができません。

 

おすすめ

転載: www.cnblogs.com/wenbochang/p/11317571.html