Что вы на самом деле используете для этого метода lockInterruptibly
? Я прочитал API, но мне это не очень понятно. Может ли кто-нибудь выразить это другими словами?
Фактическое использование lockInterruptibly для ReentrantLock
Ответ 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