/** * get named semaphore * * @param name * @return */ public RSemaphore getSemaphore(String name) { RSemaphore semaphore = redissonClient.getSemaphore(name); semaphore.trySetPermits(1); return semaphore; } }
/** * get named semaphore * * @param name * @return */ public RSemaphore getSemaphore(String name) { RSemaphore semaphore = redissonClient.getSemaphore(name); semaphore.trySetPermits(1); return semaphore; } }
@Override public boolean acquire(Object key, int permits) { RSemaphore rSemaphore = redisson.getSemaphore(key.toString()); rSemaphore.trySetPermits(permits); return rSemaphore.tryAcquire(); }
@Override @SneakyThrows public Lock tryGetLock(String lockName, long timeout, TimeUnit timeUnit) { String id = IdUtils.newUUID(); RSemaphore semaphore = rSemaphoreMap.computeIfAbsent(lockName, key -> { RSemaphore rSemaphore = redissonClient.getSemaphore(key); rSemaphore.trySetPermits(1); return rSemaphore; }); log.debug("try lock {} permits:{},id={}", lockName, semaphore.availablePermits(), id); boolean success = semaphore.tryAcquire(timeout, timeUnit); if (!success) { throw new TimeoutException("try lock " + lockName + " timeout"); } return () -> { semaphore.release(); log.debug("unlock {},id={}", lockName, id); }; }
public static void main(String[] args) throws InterruptedException { // connects to 127.0.0.1:6379 by default RedissonClient redisson = Redisson.create(); RSemaphore s = redisson.getSemaphore("test"); s.trySetPermits(5); s.acquire(3); Thread t = new Thread() { @Override public void run() { RSemaphore s = redisson.getSemaphore("test"); s.release(); s.release(); } }; t.start(); s.acquire(4); redisson.shutdown(); }