解锁另一个线程java拥有的锁
我有一个LockManager来管理多个线程的锁。有时线程是坏男孩,我必须杀死它们并要求LockManager释放所有锁。但是,由于我无法在Java中使用ReentrantLock,因此无法解锁另一个线程拥有的锁。
我被迫使用锁(不能使用信号灯,这是作业的重点)。是否有任何Java Lock实现可让我解锁其他线程拥有的锁?
到目前为止,我考虑的选项是:
- 以允许我执行此操作的方式重新实现ReentrantLock
- 在信号量和ReentrantLocks之间进行某种映射
您可能会发现有用的额外资源:
- 可重入锁-从另一个线程解锁
回答:
你会被允许使用自己的Lock
吗?这是一个完全代理的类,Lock
但是当被告知强制进行解锁时,它仅替换了它要替换的新锁。这应该具有您想要的效果。遗憾的是,它仍然无法处理悬空的锁,但现在变成了别人的问题。现在,您的锁已神奇解锁。
static class LockProxy<L extends Lock> implements Lock { // The actual lock.
private volatile Lock lock;
public LockProxy(L lock) {
// Trap the lock we are proxying.
this.lock = lock;
}
@Override
public void lock() {
// Proxy it.
lock.lock();
}
@Override
public void lockInterruptibly() throws InterruptedException {
// Proxy it.
lock.lockInterruptibly();
}
@Override
public boolean tryLock() {
// Proxy it.
return lock.tryLock();
}
@Override
public boolean tryLock(long l, TimeUnit tu) throws InterruptedException {
// Proxy it.
return lock.tryLock(l, tu);
}
@Override
public void unlock() {
// Proxy it.
lock.unlock();
}
@Override
public Condition newCondition() {
// Proxy it.
return lock.newCondition();
}
// Extra functionality to unlock from any thread.
public void forceUnlock() {
// Actually just replace the perhaps locked lock with a new one.
// Kinda like a clone. I expect a neater way is around somewhere.
if (lock instanceof ReentrantLock) {
lock = new ReentrantLock();
} else {
throw new UnsupportedOperationException(
"Cannot force unlock of lock type "
+ lock.getClass().getSimpleName());
}
}
}
以上是 解锁另一个线程java拥有的锁 的全部内容, 来源链接: utcz.com/qa/397451.html