3

我有一个可重入锁,我将它包装在一个自定义类中以满足我自己的需要。但是,由于应用程序的性质,持有可重入锁的锁的线程会卡住(外部故障)并且无法释放可重入锁。

我想知道是否有一种方法可以显式解锁可重入锁?我知道可重入锁的 API 没有这样的方法 - 但是我正在考虑引入一个计时器任务,该任务将在一段时间后解锁可重入锁或杀死持有可重入锁的线程。

尝试强制解锁我的可重入锁还有其他建议吗?我的解决方案很漂亮,所以我问。

4

2 回答 2

2

我不会在外部解锁,而是在单独的线程中执行阻塞代码并让它超时

像这样的东西

Future<MyTask>future = taskExecutor.submit(myTask)
try {
    future.get(5,TimeUnit.Seconds);
    ...
    }
    catch (Exception e)
    {
        future.cancel(true); // attempt to interupt the thread
        throw new Exception();
    }
于 2012-10-09T01:58:05.597 回答
1

根据我的评论,任何锁都应该包裹在一个try/finally块周围,以确保在出现问题时释放锁

_lock.lock(); // will wait until this thread gets the lock
try
{
    // critical section
}
finally
{
    //releasing the lock so that other threads can get notifies
    _lock.unlock();
}       

这在锁定对象跟踪中得到了演示

于 2012-10-09T02:00:26.420 回答