Фактическое использование lockInterruptibly для ReentrantLock

Что вы на самом деле используете для этого метода lockInterruptibly? Я прочитал API, но мне это не очень понятно. Может ли кто-нибудь выразить это другими словами?

Ответ 1

Логика такая же, как и для всех прерывных методов блокировки: она позволяет потоку немедленно реагировать на сигнал interrupt, отправленный ему из другого потока.

Как эта особенность используется, зависит от дизайна приложения. Например, его можно использовать для уничтожения контингента потоков в пуле, которые все ждут блокировки.

Ответ 2

lockInterruptibly() может блокироваться, если блокировка уже удерживается другим потоком и будет ждать, пока не будет активирована блокировка. Это то же самое, что и с обычным lock(). Но если другой поток прерывает ожидающий поток lockInterruptibly() будет бросать InterruptedException.

Ответ 3

Попробуйте понять эту концепцию с помощью приведенного ниже примера кода.

Пример кода:

package codingInterview.thread;

import java.util.concurrent.locks.ReentrantLock;

public class MyRentrantlock {

    Thread t = new Thread() {

        @Override
        public void run() {

            ReentrantLock r = new ReentrantLock();
            r.lock();

            System.out.println("lock() : lock count :" + r.getHoldCount());

            interrupt();
            System.out.println("Current thread is intrupted");
            r.tryLock();
            System.out.println("tryLock() on intrupted thread lock count :" + r.getHoldCount());
            try {
                r.lockInterruptibly();
                System.out.println("lockInterruptibly() --NOt executable statement" + r.getHoldCount());
            } catch (InterruptedException e) {
                r.lock();
                System.out.println("Error");
            } finally {
                r.unlock();
            }

            System.out.println("lockInterruptibly() not able to Acqurie lock: lock count :" + r.getHoldCount());

            r.unlock();
            System.out.println("lock count :" + r.getHoldCount());
            r.unlock();
            System.out.println("lock count :" + r.getHoldCount());

        }

    };

    public static void main(String str[]) {
        MyRentrantlock m = new MyRentrantlock();
        m.t.start();

        System.out.println("");
    }

}

Выход:

lock() : lock count :1
Current thread is intrupted
tryLock() on intrupted thread lock count :2
Error
lockInterruptibly() not able to Acqurie lock: lock count :2
lock count :1
lock count :0

Ответ 4

Я просто нарочно придумала такую демонстрацию, но на самом деле я понятия не имею, где именно она может быть использована. Возможно, это демо может помочь немного :)

private static void testReentrantLock() {
    ReentrantLock lock = new ReentrantLock();
    Thread thread = new Thread(() -> {
        int i = 0;
        System.out.println("before entering ReentrankLock block");
        try {
            lock.lockInterruptibly();
                while (0 < 1) {
                    System.out.println("in the ReentrankLock block counting: " + i++);
                }
        } catch (InterruptedException e) {
            System.out.println("ReentrankLock block interrupted");
        } 
    });
    lock.lock();
    thread.start();
    thread.interrupt();
}

Выход

before entering ReentrankLock block
ReentrankLock block interrupted