6

我正在使用 RSemaphore 来维护特定的计数。请看下面:-

RSemaphore sem = redisson.getSemaphore("custid=10");
sem.trySetPermits(10);
  try {
     sem.acquire();
  } catch (InterruptedException e) {
     e.printStackTrace();
  }

  System.out.println(Thread.currentThread().getName() + ": Acquired permit");

  try {
     Thread.sleep(60000);
  } catch (InterruptedException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
  }

  System.out.println(Thread.currentThread().getName() + ": Releasing permit");
  sem.release();

我在最后发布了信号量,但有时我的代码执行可能会停止、终止或由于特定原因我停止服务器。那么获取的信号量将永远不会被释放。

为了处理这种情况,我想要信号量,它会在特定时间后自动释放。

4

1 回答 1

3

您应该使用 PermitExpirableSemaphore,如下所示:

RPermitExpirableSemaphore semaphore =redisson.getPermitExpirableSemaphore("mySemaphore"); 

// acquire permit with lease time = 2 seconds 
String permitId = semaphore.acquire(2, TimeUnit.SECONDS);
// ... Do something 
semaphore.release(permitId);

信号量默认2秒后自动释放。

于 2018-08-23T12:08:16.550 回答