Semaphore并发包
semaphore是基于计数的记号量,它可以设定一个资源的总数量,基于这个总数量,多线程竞争获取许可信号,做自己的申请后,返回许可,并释放资源.超过总数量后,线程申请许可,信号将被阻塞,待有资源后,继续执行
下面是单线程实现:
package cn.easyAccess.core.cache.local;
import java.util.concurrent.Semaphore;
/**
* @author lqyang
* @Title: ${file_name}
* @date 2018/9/511:29
*/
public class semaphoreDemo {
Semaphore semaphore = new Semaphore(1);
public void TestSemaphore(){
try {
//获取资源许可数量
int var = semaphore.availablePermits();
if (var <= 0){
System.out.println(Thread.currentThread().getName()+"资源许可被占用");
}
//获取许可
semaphore.acquire();
System.out.println(Thread.currentThread().getName()+"资源许可拿到-->start");
Thread.sleep(10);
System.out.println(Thread.currentThread().getName()+"资源处理完毕-->stop");
//将占用信号归还
semaphore.release();
}catch (Exception e){
e.printStackTrace();
}
}
}
package cn.easyAccess.core.cache.local;
/**
* @author lqyang
* @Title: ${file_name}
* @date 2018/8/510:49
*/
public class semaphoreTest extends Thread{
semaphoreDemo semaphoreDemo;
public semaphoreTest(semaphoreDemo semaphoreDemo){
super();
this.semaphoreDemo = semaphoreDemo;
}
@Override
public void run() {
//TODO
semaphoreDemo.TestSemaphore();
}
}
package cn.easyAccess.core.cache.local;
/**
* @author lqyang
* @Title: ${file_name}
* @date 2018/9/511:54
*/
public class demoTest {
public static void main(String[] args) {
semaphoreDemo semaphoreDemo = new semaphoreDemo();
new semaphoreTest(semaphoreDemo).start();
}
}
执行结果如下:
多线程实现:
for (int i= 1; i< 5; i++){
new semaphoreTest(semaphoreDemo).start();
}
执行结果如下:
下面是springboot具体实现:
@GetMapping("/getOrderBuyerInfo")
public RespApi getOrderBuyerInfo(String keyword){
//可用资源数
int availablePermits = semaphore.availablePermits();
List<BuyersInfoModel> buyersInfoModels = new ArrayList<>();
if (availablePermits > 0){
logger.info("抢到资源");
}else {
logger.info("资源已被占用");
return RespApi.failure("No resources");
}
try{
//请求占用一个资源
semaphore.acquire(1);
String userId = getUser().getCreateUserId();
buyersInfoModels = orderService.getOrderShippingInfo(userId,keyword);
}catch (Exception e){
e.printStackTrace();
return RespApi.failure("error");
}finally {
//释放资源
semaphore.release(1);
}
return RespApi.success(buyersInfoModels);
}
通过semaphore来实现线程安全。