【问题标题】:Synchronized method release after a specified timeout指定超时后同步方法释放
【发布时间】:2020-03-29 16:09:47
【问题描述】:

我有一个简单的问题。我基本上有一个同步方法,当被调用时它会执行一些任务。

我使用多线程,有时,当一个线程执行任务时,线程挂起导致同步方法无限期地处于阻塞状态。这不允许下一个进程访问该块。

有没有一种方法可以设置一个计时器,在所述时间(比如 60 秒)之后,同步方法被释放,以便其他线程仍然可以继续而不被阻塞?

如果有办法,有人可以提供一个示例代码。

提前致谢!

【问题讨论】:

    标签: java multithreading timeout synchronized


    【解决方案1】:

    您可以使用锁代替同步关键字

    为了能够强制解锁另一个线程拥有的锁,您可以使用以下实现https://stackoverflow.com/a/16492269/5313017

    方法如下

        public void synchronizedMethod() {
            if(!lock.tryLock(10, TimeUnit.SECONDS)){
                lock.forceUnlock();
            }
            doStuff();
            lock.unlock();
        }
    

    【讨论】:

    • 谢谢。我想这就是我要找的。一个问题,没有 forceUnlock();只有 lock.unlock() 不会中断或停止另一个线程。即使在设定的时间之后,它也处于等待状态。还有其他类似 forceUnlock() 的东西吗?
    • @Manohar 这个答案建议使用链接答案中的Lock 代理。我只能强烈反对。这个 hack 在很多方面都被破坏了……
    • @Holger,你会推荐什么?
    • @Manohar 当您认为,您可以强制释放锁而不会遇到完全损坏的数据结构,这表明代码持有锁的时间过长。因此,您应该修复代码以仅在必要时保持锁定(这就是为什么 id 被称为代码的“关键部分”)。
    猜你喜欢
    • 2014-06-07
    • 1970-01-01
    • 1970-01-01
    • 2021-02-22
    • 2013-09-06
    • 2015-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多