1.信号量?
Semaphore 通常我们叫它信号量, 可以用来控制同时访问特定资源的线程数量,通过协调各个线程,以保证合理的使用资源。
可以把它简单的理解成我们停车场入口
2.模拟场景
模拟一个停车场停车的场景,总共300个停车位,这里我们方便测试假设3个
不多说,上代码
@RequestMapping({"/park"})
@ResponseBody
public String park(){
RSemaphore park = redissonClient.getSemaphore("park");
try {
park.acquire();
} catch (InterruptedException e) {
e.printStackTrace();
}
return "停好了";
}
@RequestMapping({"/go"})
@ResponseBody
public String go(){
RSemaphore park = redissonClient.getSemaphore("park");
try {
park.release();
} catch (Exception e) {
e.printStackTrace();
}
return "开走了";
}
2.测试
上图一,前面三次停车都成功了,第四次因为没有车位了,所以卡在那里在等待
当我图二开走一两后,图一立马又停车成功
再举个例子,数据库连接,我们可以设置固定的最大连接数,也是可以以此方式实现
优化:tryAcquire
上面是阻塞式等待,其实当我们发现没车位了一般是不会等待的而是开走停别的地方去
把上面那块代码修改如下
@RequestMapping({"/park"})
@ResponseBody
public String park(){
RSemaphore park = redissonClient.getSemaphore("park");
boolean b = park.tryAcquire();
if(b){
return "停好了";
}
return "没车位了";
}
再去发现你会发现不会阻塞等待,而是直接打印没车位了