解锁另一个线程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

回到顶部