2

私はスレッドの世界の初心者であり、最新の util パッケージの再入可能ロック メカニズムにスレッドを進めています。記事のように、同期メカニズムと新しく追加されたロック メカニズムの基本的な違いを調べていました。

  1. ReentrantLock と synchronized キーワードのもう 1 つの重要な違いは、公平性です。synchronized キーワードは公平性をサポートしていません。解放されたロックはどのスレッドでも取得でき、優先度は指定できませんが、ReentrantLock のインスタンスを作成する際に fairness プロパティを指定することで、ReentrantLock を公平にすることができます。公平性プロパティは、競合が発生した場合に、最も長く待機しているスレッドにロックを提供します。この点を証明する小さなプログラムを提供してください。

  2. synchronized と ReentrantLock の主な違いは、ロックを中断してタイムアウトを試行できることです。同期の場合のように、スレッドは無限にブロックする必要はありません. この点を証明する小さなプログラムを提供してください.

  3. ReentrantLock と Java の synchronized キーワードのもう 1 つの注目すべき違いは、Lock の待機中に Thread を中断できることです。synchronized キーワードの場合、スレッドは無期限にロックを待機してブロックされる可能性があり、それを制御する方法はありませんでした。ReentrantLock は と呼ばれるメソッドを提供しlockInterruptibly()ます。これは、ロックを待っているときにスレッドを中断するために使用できます。同様にtryLock()、タイムアウトを使用して、ロックが一定期間利用できない場合にタイムアウトすることができます。この点を証明する小さなプログラムを提供してください。

上記の3つのポイントをすべて示す小さなプログラムを提供してください。

私はこのプログラムを試しました。上記の 3 点を証明するためにどのような変更を行う必要があるか教えてください。

public class ReentrantLockHowto {

    private final ReentrantLock lock = new ReentrantLock();
    private int count = 0;

     //Locking using Lock and ReentrantLock
     public int getCount() {
        lock.lock();
        try {
            System.out.println(Thread.currentThread().getName() + " gets Count: " + count);
            return count++;
        } finally {
            lock.unlock();
        }
     }

     //Implicit locking using synchronized keyword
     public int getCountTwo() {
            return count++;
     }



    public static void main(String args[]) {
        final ThreadTest counter = new ThreadTest();
        Thread t1 = new Thread() {

            @Override
            public void run() {
                while (counter.getCount() < 6) {
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException ex) {
                        ex.printStackTrace();                    }
                }
            }
        };

        Thread t2 = new Thread() {

            @Override
            public void run() {
                while (counter.getCount() < 6) {
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException ex) {
                        ex.printStackTrace();
                    }
                }
            }
        };

        t1.start();
        t2.start();

    }
}

出力:

Thread-0 gets Count: 0
Thread-1 gets Count: 1
Thread-1 gets Count: 2
Thread-0 gets Count: 3
Thread-1 gets Count: 4
Thread-0 gets Count: 5
Thread-0 gets Count: 6
Thread-1 gets Count: 7
4

0 に答える 0