Re-EntrantLocks と の理論的な違いはわかってsynchronized
いますが、以下の点で混乱しています。
synchronized
Javarevisited の比較とLock
オブジェクトに関する記事からこのステートメントを参照してください。
ReentrantLock と Java の synchronized キーワードのもう 1 つの注目すべき違いは、Lock の待機中に Thread を中断できることです。synchronized キーワードの場合、スレッドは無期限にロックを待機してブロックされる可能性があり、それを制御する方法はありませんでした。ReentrantLock は、lockInterruptively() と呼ばれるメソッドを提供します。これは、ロックを待っているときにスレッドを中断するために使用できます。同様に、タイムアウトを指定した tryLock() を使用して、ロックが一定時間利用できない場合にタイムアウトすることができます。
上記のステートメントに従って、同期されたメソッドで Thread waiting() を中断しようとしました (つまり、待機をブロックする) と、InterruptedException がスローされました。しかし、この振る舞いは、上記のステートメントで述べられていることと矛盾しています。
// this method is called from inside run() method of every thread.
public synchronized int getCount() {
count++;
try {
Thread.sleep(3000);
System.out.println(Thread.currentThread().getName() + " gets " + count);
} catch (InterruptedException e) {
e.printStackTrace();
}
return count;
}
....
....
t1.start();
t2.start();
t3.start();
t4.start();
t2.interrupt();
これが私が得た出力です:
Thread 1 gets 1
Thread 4 gets 2
Thread 3 gets 3
java.lang.InterruptedException: sleep interrupted
at java.lang.Thread.sleep(Native Method)
at locks.SynchronizedLockInterrupt.getCount(SynchronizedLockInterrupt.java:10)
at locks.SynchronizedLockInterrupt$2.run(SynchronizedLockInterrupt.java:35)
at java.lang.Thread.run(Unknown Source)
私の例が正しくないか、または Synchronized() に関する引用文が正しくないか、混乱していますか?