解锁另一个线程 java 拥有的锁

2022-09-01 23:39:30

我有一个LockManager,可以管理多个线程的锁。有时线程是坏男孩,我必须杀死他们并要求LockManager释放他们所有的锁。但是,由于我在java中使用ReentrantLock,这是不可能的,我无法解锁另一个线程拥有的锁。

我被迫使用锁(不能使用信号量,这是家庭作业的要点)。是否有任何Java Lock实现允许我解锁其他线程拥有的锁?

到目前为止,我考虑的选项是:

  • 以允许我执行此操作的方式重新实现 ReentrantLock
  • 在信号量和重入锁之间进行某种映射

您可能会发现有用的其他来源:


答案 1

你已经发现了一个主要原因,为什么常识说:不要杀死线程!

锁只是强制终止线程时可能发生的潜在资源泄漏之一。考虑打开的文件和套接字等。

还要考虑的是,如果您确实设法解锁了锁,那么锁首先被锁定是有原因的。例如,线程可能已部分更新了数据结构,并且允许从另一个线程访问该结构可能会导致奇怪且奇妙的程序故障,这些故障即使不是不可能调试,也很难调试。

处理这种情况的最佳方法是要求线程消失。将“stop()”方法添加到与线程关联的对象(每个线程都有一个对象,不是吗?)来设置一个标志,并让线程定期检查此标志,如果设置了,则退出。

如果您的线程行为异常,无法阻止它们检查 stop 标志,那么正确的方法是修复代码,使其不会出现异常行为。


答案 2

你会被允许使用自己的吗?这是一个完全代理的类,但是当它被告知强制解锁时,它只是用一个新的锁替换它代理的锁。这应该具有您想要的效果。可悲的是,它仍然没有处理悬垂的锁,但现在成为别人的问题。您的锁现在神奇地解锁了。LockLock

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());
        }
    }
}

推荐