redis redisson 信号量示例
作用:限制同时访问共享区域的线程数量
********************
相关接口
RSemaphore
public interface RSemaphore extends RExpirable, RSemaphoreAsync {
boolean trySetPermits(int var1); //设置permits数
void reducePermits(int var1); //减少permit数
void acquire() throws InterruptedException; //获得一个permit
void acquire(int var1) throws InterruptedException; //获得var1个permits
boolean tryAcquire(); //尝试获得permit
boolean tryAcquire(int var1); //尝试获得var1个permit
boolean tryAcquire(long var1, TimeUnit var3) throws InterruptedException; //尝试获得permit,等待时间var1
boolean tryAcquire(int var1, long var2, TimeUnit var4) throws InterruptedException;
//尝试获得var1个permit,等待时间var2
void release(); //释放permit
void release(int var1); //释放var1个permits
int availablePermits(); //信号量的permits数
int drainPermits(); //清空permits
}
********************
示例
public class MyTest6 {
public static void main(String[] args){
Config config=new Config();
config.useSingleServer().setAddress("redis://***:6379").setPassword("123456");
RedissonClient client= Redisson.create(config);
RSemaphore semaphore=client.getSemaphore("semaphore");
semaphore.trySetPermits(5);
ExecutorService executorService= Executors.newFixedThreadPool(5);
for (int i=0;i<10;i++){
executorService.submit(()->{
try{
semaphore.acquire();
System.out.println("线程"+Thread.currentThread().getId()+" 获得permit:"+System.currentTimeMillis());
Thread.sleep(1000);
}catch (Exception e){
e.printStackTrace();
}finally {
System.out.println("线程"+Thread.currentThread().getId()+" 释放permit:"+System.currentTimeMillis());
semaphore.release();
}
});
}
}
}
*************
控制台输出
线程49 获得permit:1574646338160
线程50 获得permit:1574646338161
线程48 获得permit:1574646338161
线程51 获得permit:1574646338164
线程52 获得permit:1574646338164
线程49 释放permit:1574646339162
线程48 释放permit:1574646339162
线程50 释放permit:1574646339162
线程51 释放permit:1574646339165
线程52 释放permit:1574646339165
线程50 获得permit:1574646339189
线程49 获得permit:1574646339189
线程48 获得permit:1574646339189
线程52 获得permit:1574646339191
线程51 获得permit:1574646339191
线程48 释放permit:1574646340190
线程50 释放permit:1574646340190
线程49 释放permit:1574646340190
线程51 释放permit:1574646340191
线程52 释放permit:1574646340191