他のスレッドロックロック
ロックと同期の違いを:
1 )ロックではないのJava 内蔵の言語、同期がされたJava キーワード言語とそのための組み込み機能です。ロックされている java.util.concurrent.locks パッケージ一般的に使用されるクラス(インターフェイス)、このクラスを介してアクセス同期させることができます。
2 )ロックと同期それは非常に大きな違いで使用して同期するとき、手動でロックを解除することをユーザに要求することなく同期方法または同期実行されるコードブロックの後、システムは自動的にスレッドが占有のロックを解除するであろうとロックユーザーでなければなりませんロックを解除するためのイニシアチブを取るていない場合は、手動で、ロックを解除するために、それがデッドロックにつながる可能性があります。
ロックインタフェース:
パブリックインターフェイスロック{
空ロック(); //ロックを取得
lockInterruptibly()を無効にすることはInterruptedExceptionあるスロー; //ロックを取得し、ロックを待っている時に中止することができ、待機
ブールのtryLock()。
ブールのtryLock(長い時間、TimeUnit unit)指定例外:InterruptedExceptionをスローします。
空ロック解除();
}
ロック使用の各メソッドのためのインタフェース:
ロック() 、のtryLock() 、のtryLock(ロング・タイム、TimeUnitでユニット)、()内のlockInterruptiblyは、ロックを取得するために使用されます。UNLOCK()メソッドは、ロックを解除するために使用されます。
差を求める4つのロック方法:
ロック()メソッドは、最も一般的な使用方法であり、ために使用されるロックを獲得します。ロックが別のスレッドによって獲得されている場合は待機しています。
目の前にいる場合について話しましたのでロック、ロックを解除するためのイニシアチブをとる必要があり、例外が発生したときに、自動的にロックを解放しません。そのため、一般的には、使用ロックしなければならない{}キャッチ{}しようとブロックが行われ、上のロックを解除する操作最終的デッドロックを防ぐために、ブロックはロックが解除されていなければならないことを保証するために行われます。
tryLock()メソッドがする表す値を返し買収が成功した場合、ロックを取得しようとし、リターンtrueに、買収は(すなわち、ロックが別のスレッドによって獲得された)失敗した場合、それを返し、偽、この方法は、とにかく言いましたそれはなりますすぐに復帰します。私は、ロックを取得しないときに待つ必要はありません。
tryLock(長い時間、TimeUnitで単位)法とのtryLock()メソッドは似ていますが、違いはロックはそれがロックを取得できない場合は、いくつかの時間を待つために得ることはありません、この方法では、それは期間内返すということです偽。あなたは待機の期間中にロックまたはロックを取得するために開始した場合、あなたが取得する場合、それを返し、trueに。
lockInterruptibly()メソッドは、スレッドがロックを獲得するために待機している場合、ロックをこのように取得する際に、かなり特殊で、その後、スレッドは、割り込み、スレッドの状態で割り込みレイテンシに応答することができます。だから、ときに、2つのスレッドを同時にすることによってと言うlock.lockInterruptibly()この時間は、スレッドの場合は、ロックを取得したいAがロックを取得し、スレッドBは、その後、スレッドだけ待っBがコールしthreadB.interrupt()メソッドすることができます割り込みスレッドBの待機中のプロセス。
スレッドがロックを取得するときに、されないことに注意してください中断()メソッドを中断。
だから、ときによって lockInterruptibly()あなたは、のを待っているが、割り込みである場合のみを得ることができない場合は、ロック方法を取得。
とと同期したスレッドの状態がロックを待機しているときに、中断、そして唯一の永遠に待つことができないように修正。
ReentrantLockの
直接ロックインターフェース、我々はいくつかの方法を実装する必要があり、便利ではない、ReentrantLockのが唯一の達成のロッククラスのインタフェースを、そしてReentrantLockのはより多くの方法、提供してReentrantLockの意味、「リエントラントロックを。」
ReentrantLockの使用例:
(1)ロック()適切な使用
輸入はjava.util.ArrayList;
輸入java.util.concurrent.locks.Lock。
輸入java.util.concurrent.locks.ReentrantLock。
パブリッククラスMyLockTest {
プライベート静的のArrayList <整数>のArrayList =新規のArrayList <整数>();
静的ロックロック=新しいReentrantLockの(); //锁对象
パブリック静的<E>無効メイン(文字列[] args){
新しいスレッド(){
公共ボイドラン(){
スレッドスレッド=にThread.currentThread()。
lock.lock();
{しようと
するSystem.out.println(thread.getName()+ "得到了锁");
(I 0 = int型、iが5 <; Iは++){ため
arrayList.add(I)。
}
キャッチ}(例外E){
// TODO:例外ハンドル
}最後に{
System.out.printlnは(Thread.getName()+ "ロック解除");
lock.unlock(); //リリースロック
}
}。
}。開始();
新しいスレッド(){
ます。public void実行(){
スレッドスレッド=にThread.currentThread();
lock.lock();
{しようと
するSystem.out.println(thread.getName()+ "得到了锁");
(I 0 = int型、iが5 <; Iは++){ため
arrayList.add(I)。
}
}キャッチ(例外e){
// TODO:ハンドル例外
最後に{}
のSystem.out.println(Thread.getName()+ "ロック解除");
lock.unlock();
}
}。
}。開始();
}
}
(2)のtryLock()を使用します
輸入はjava.util.ArrayList;
輸入java.util.concurrent.locks.Lock。
輸入java.util.concurrent.locks.ReentrantLock。
/ **
*観察された現象:スレッドがロックを取得した後、別のスレッドがロックに失敗し、待つ必要はありません
* @author
*
* /
publicクラスMyTryLock {
プライベート静的ArrayListに<整数> ArrayListを=新しいのArrayList <Integer型>();
静的ロックロック=新しいReentrantLockの(); //注意这个地方
公共の静的な無効メイン(文字列[] args){
新しいスレッド(){
公共ボイドラン(){
スレッドスレッド=にThread.currentThread()。
ブールのtryLock = lock.tryLock()。
System.out.println(thread.getName()+」「+のtryLock)。
(のtryLock)なら、{
{試みる
のSystem.out.println(thread.getNameを()+ "得到了锁")。
{(; iが5 <I ++はiが0 = INT)のために
arrayList.add(I);
}
}キャッチ(例外e){
// TODO:例外を処理
}最後に{
のSystem.out.println(thread.getName()+ "释放了锁")。
施錠開錠();
}
}
}。
}。開始();
新しいスレッド(){
ます。public void実行(){
スレッドスレッド=にThread.currentThread();
ブールのtryLock = lock.tryLock()。
System.out.println(thread.getName()+」「+のtryLock)。
(のtryLock)なら、{
{試みる
のSystem.out.println(thread.getNameを()+ "得到了锁")。
(I 0 = int型、iが5 <; Iは++){ため
arrayList.add(I)。
}
}キャッチ(例外e){
// TODO:例外を処理
}最後に{
のSystem.out.println(thread.getName()+ "释放了锁")。
施錠開錠();
}
}
}。
}。開始();
}
}
(3)lockInterruptibly()使用の中断に応答して