【问题标题】:Timed-out lock in javajava中的超时锁
【发布时间】:2012-11-22 18:13:26
【问题描述】:

我正在寻找可以帮助我实现以下模式(伪代码)的机制:

TimeoutLock lock = new TimeoutLock();
while(condition) {

    prepare();

    lock.enter(); //cannot enter until specified lock timeout elapses
    execute();
    lock.lockFor(2 minutes);

    finish();
}

我需要将调用限制为 execute,使其发生的频率不超过某个指定的时间间隔(例如,两分钟),但我不想阻止 prepare执行(如果没有必要)。我想知道java是否支持任何锁定机制,一段时间后会“消失”。要求当然是锁不通过,即使它是由同一个线程进入的,从而锁定它。

我正在考虑涉及信号量和TimerTask的解决方案,或者自己计算截止日期并睡多余的时间,但我想知道这样的东西是否已经可用。

谢谢

【问题讨论】:

  • 您应该绝对不要将其设计为在超时期间阻塞线程。调度方法是必须的。
  • 我会在 ScheduledThreadPoolExecutor 或 DelayQueue 周围使用包装器。
  • 调度会好很多,我同意。但是您能否简要解释一下为什么阻塞线程(任何线程?或者只是一个主线程?)是一件坏事?

标签: java locking timeout


【解决方案1】:

不需要特殊的类:

synchronized(lock) {
   execute();
   Thread.sleep(120 * 1000)
}

【讨论】:

  • 当我们离开时同步块锁被释放
【解决方案2】:

下面会做 基本上,您有一个信号量,只有在有可用许可的情况下才允许您访问,我在这种情况下为零许可。所以它会尝试 2000 秒才最终放弃 ->

Semaphore s = new Semaphore(0);
Object lock = new Object();
 synchronized(lock)
{
execute();
s.tryAcquire(2,TimeUnit.Minutes)
}

Thread.sleep 是一种蹩脚和低级的做法。不推荐

【讨论】:

    【解决方案3】:

    As Marko says,您很可能希望通过将工作交给某种调度程序来执行此操作,而不是阻塞线程。

    但是,如果您确实想这样做,我建议您通过在退出临界区时记录时间戳来做到这一点,并让进入的线程在此之后等待一段时间才能通过。比如:

    public class TimeoutLock {
    
        private boolean held;
        private long available;
    
        public void enter() throws InterruptedException {
            acquire();
            long pause;
            while ((pause = available - System.currentTimeMillis()) > 0L) {
                Thread.sleep(pause);
            }
        }
    
        private synchronized void acquire() throws InterruptedException {
            while (held) {
                wait();
            }
            held = true;
        }
    
        public synchronized void lockFor(long period) {
            held = false;
            available = System.currentTimeMillis() + period;
            notify();
        }
    
    }
    

    【讨论】:

      【解决方案4】:

      你可以使用睡眠

      sleep(1000);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-15
        • 2018-05-12
        • 2021-05-29
        • 1970-01-01
        • 2015-10-17
        • 2017-12-23
        相关资源
        最近更新 更多