Мой вопрос связан с этим: Выйдите из метода, если его выполняет другой поток
Есть метод, который выполняется несколькими потоками. Если один поток выполняет метод, любой другой поток должен просто выйти. Мое решение таково:
public class ReentrantLockTest implements Runnable {
private static final ReentrantLock LOCK = new ReentrantLock();
@Override
public void run() {
if (LOCK.tryLock()) {
System.out.println("Aquired. Thread " + Thread.currentThread().getId());
try {
// do stuff here
} catch (Exception e) {
// handle errors
} finally {
// release the lock
LOCK.unlock();
}
}
}
Мне кажется, что это нормально, но на производстве иногда случается, что блокировка остается невыпущенной, поэтому метод вообще не выполняется, пока я не перезапущу систему.
Итак, у меня два вопроса: 1. Как это возможно, что блокировка не снимается? 2. Что такое хороший способ тестирования такого кода? Просто запустите это в al oop и надеемся, что в какой-то момент он сломается sh, если есть ошибка, которая не кажется хорошим решением.