6

Re-EntrantLocks と の理論的な違いはわかってsynchronizedいますが、以下の点で混乱しています。

synchronizedJavarevisited の比較と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() に関する引用文が正しくないか、混乱していますか?

4

5 に答える 5

0

「Thread.sleep(3000)」を削除すると、「getCount()」メソッドは例外をスローしません。

Synchronized メソッドの場合は、スリープ中または待機中のいずれかでのみスレッドに割り込むことができます

于 2021-04-27T13:37:33.317 に答える
-1

同期を中断しているのではなく、sleep().

于 2014-08-23T11:36:57.680 に答える