springboot线程安全处理方法记录

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来实现线程安全。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容