首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >另一个线程java拥有的解锁锁

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

Stack Overflow用户
提问于 2013-05-10 21:50:26
回答 5查看 16K关注 0票数 23

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

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

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

  • 以允许我这样做的方式重新实现ReentrantLock
  • 在信号量和ReentrantLocks之间进行某种映射

你可能会发现额外的资源是有用的:

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-05-10 23:41:39

你可以使用你自己的Lock吗?下面是一个完全代理Lock的类,但是当它被告知强制解锁时,它只是替换锁,它用一个新的锁进行代理。这应该有你想要的效果。可悲的是,它仍然没有处理剩下的锁,但现在这变成了其他人的问题。你的锁现在被魔法解锁了。

代码语言:javascript
运行
复制
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());
        }
    }
}
票数 10
EN

Stack Overflow用户

发布于 2013-05-10 21:58:58

你已经发现了一个主要的原因,为什么普通的智慧说:不要杀死线程!

如果强行关闭线程,锁只是可能发生的资源泄漏之一。考虑打开文件和套接字等。

还请考虑,如果您确实设法解除锁,有一个原因,锁被锁定在第一。例如,线程可能已经部分更新了数据结构,并且允许从另一个线程访问该结构可能会导致奇怪和奇妙的程序故障,这些程序故障很难调试,甚至不可能调试。

处理这种情况的最好方法是让线程走开。向与线程关联的对象中添加一个“to ()”方法(每个线程都有一个对象,不是吗?)这将设置一个标志,并让线程定期检查此标志,并在设置该标志时退出。

如果您的线程行为不当,从而阻止它们检查停止标志,那么正确的方法是修复代码,使其不出现错误行为。

票数 12
EN

Stack Overflow用户

发布于 2019-05-02 22:12:54

我用AtomicReference做了这件事,它在优雅方面得到了零分,但我不知道还有什么别的方法。

代码语言:javascript
运行
复制
class PseudoLock {

    private final AtomicReference<Boolean> mylock = new AtomicReference<>(Boolean.FALSE);


    boolean trylock() {
        return mylock.compareAndSet(Boolean.FALSE, Boolean.TRUE);
    }

    void unlock() {
        boolean done = mylock.compareAndSet(Boolean.TRUE, Boolean.FALSE);
        if (!done) {
            throw new IllegalStateException("Cannot unlock an unlocked thread");
        }
    }
}

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16491287

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档