Java 强制解锁可重入的锁

Java 强制解锁可重入的锁,java,multithreading,concurrency,locking,reentrancy,Java,Multithreading,Concurrency,Locking,Reentrancy,我有一个可重入的锁,我将它包装在一个定制类中,以满足我自己的需要。但是,由于应用程序的性质,持有可重入锁的锁的线程会被卡住(外部故障),无法释放可重入锁 我想知道是否有一种方法可以显式解锁可重入锁?我知道可重入锁的API没有这样的方法,但是我正在考虑引入一个计时器任务,它将在一段时间后解锁可重入锁,或者杀死持有可重入锁的线程 在尝试强制解锁我的可重入锁时还有其他建议吗?我的解决方案很好,所以我问。我不会在外部解锁,而是在单独的线程中执行阻塞代码,并让它超时 像这样的 Future<MyTa

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

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


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

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

像这样的

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();
    }
Futurefuture=taskExecutor.submit(myTask)
试一试{
future.get(5,时间单位秒);
...
}
捕获(例外e)
{
future.cancel(true);//尝试中断线程
抛出新异常();
}

根据我的评论,任何锁都应该围绕
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();
}       

这在小径中得到了演示

您有一些示例代码吗??所有锁都应该包装在
try/catch/finally
块中,在最后一部分中,您应该释放您当前持有的所有锁。我感谢您的响应,但是,我希望根据您的示例强制解锁“\u锁”。同意持有者应该解锁它持有的锁,但是,持有者线程偶尔会因为一些外部依赖而进入一种不正常的状态,并且从不放弃锁。除非我以某种方式杀死线程或强制解锁“\u lock”否则没有其他线程会前进,这就是我考虑强制解锁机制的原因。我认为你无法实现你想要的。这实际上会破坏锁的用途在某些方面我完全同意你的观点,但本质上我所寻找的是一种智能的方法,以摆脱由于外部故障而导致应用程序无法继续运行和无法放弃锁的状态。顺便说一句,_lock.unlock()还抛出一个IllegalMontiorStateException,对unlock()的调用是否也应该封装在try/catch中?是否存在与for lock unlocks()等效的closequiety()函数?如果对unlock()的调用也被包装,那么是的,应该将其包装在try/catch中(除非您想抛出它)。我能想到的最好的解决方案(这真的是一个黑客行为)是提供一种进入世界线程方式的方法,允许您解锁锁定任何原因的否决票?从别人的角度学习很好我最终选择了这个解决方案:)