当前位置: 首页 > news >正文

Springboot 线程同步之Semaphore 的简单使用

如果你有一个东西, 你想别人触碰它的时候,不能同时触碰,需要按照你想要的每次多少人来触碰。

算了,不做比喻了,代码原理其实也简单,我们直接先看代码,我再做简单的解释(估计不用看解释也能懂):

package com.semaphore.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.concurrent.Semaphore;

/**
 * @Author : JCccc
 * @CreateTime : 2018-11-27
 * @Description :
 * @Point: Keep a good mood
 **/
@Controller
public class SemaphoreController {

    //定义信号资源包的总数 只有2个
    Semaphore semaphore=new Semaphore(2);


    @GetMapping("/request")
    @ResponseBody
    public String Resquest(){
        //设置这个接口可用的资源数
        int availablePermits=semaphore.availablePermits();
        if(availablePermits>0){
            System.out.println("抢到资源");
        }else{
            System.out.println("资源已被占用,稍后再试");
            return "Resource is busy!";
        }
        try {
            //请求占用一个资源
            semaphore.acquire(1);  
            System.out.println("资源正在被使用");
            //放大资源占用时间,便于观察
            Thread.sleep(30000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally{
            semaphore.release(1);//释放一个资源
            System.out.println("-----------释放资源包----------");
        }
        return "Success";
    }

}

运行的结果图(以极快的手速一起调用接口进行访问):

 

 

简单解析:

我在代码里面设置的可用的资源包是:

//定义资源包的总数 只有2个
Semaphore semaphore=new Semaphore(2);
//设置这个接口可用的资源数
int availablePermits=semaphore.availablePermits();

然后这个整体的运行流程就是这样:

一个请求调用接口,那么就会先去判断资源包还有没有?

如果有,那就抢;抢到了,就开始使用!且,此刻可用的总资源包就-1  :

//请求占用一个资源
semaphore.acquire(1);

如果没有,那就直接返回了提示,就是说资源紧张~

然后在抢到资源包开始使用的时候,我们可以看到控制台输出了一下,资源正在被使用,顾名思义(就是说有人在使用咯,当然你可以扩展,作为日志跟踪,我之前的博客有介绍怎么获取请求者的IP地址也有怎么生成日志等等)

然后在使用完毕的时候,就释放资源包,

//释放一个资源
semaphore.release(1);

那么如果刚好这时候有请求过来了,那就可以申请使用资源包了。

 

结合我的运行结果:

我一共设置2个可用资源包,然后同时跑起来5个请求, 然后就看到了前面2个请求都抢到了资源,后面的都显示资源紧张。

 

 

嗯,简单的使用介绍就这样了。 当然如果感兴趣这个玩意,推荐去再了解下限流 漏桶算法和令牌桶算法。

 

相关文章:

  • JAVA Gson的使用
  • JAVA 最全最细的fastjson使用介绍,带你透彻领悟JSON
  • fastJson注解@JSONField 的作用及其效果
  • HttpClient 不同版本的超时时间设置
  • 使用两个栈实现队列,简单例子
  • 数据库ACID
  • 线程小记
  • JAVA JDK1.8 时间戳与时间格式化 实用工具类
  • 单例模式 之内部类延迟加载,(多)线程安全
  • Springboot 用session监听器统计在线用户数量
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • JAVA 责任链设计模式
  • JAVA回调函数简单讲解 CallBack
  • JAVA HttpClient 远程调用接口doGet、doPost工具类
  • JAVA 接口签名sign生成 工具类
  • Angular 2 DI - IoC DI - 1
  • js操作时间(持续更新)
  • mysql常用命令汇总
  • php ci框架整合银盛支付
  • scala基础语法(二)
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • SpringCloud集成分布式事务LCN (一)
  • Terraform入门 - 3. 变更基础设施
  • 观察者模式实现非直接耦合
  • 区块链分支循环
  • 让你的分享飞起来——极光推出社会化分享组件
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • !!Dom4j 学习笔记
  • #define、const、typedef的差别
  • %check_box% in rails :coditions={:has_many , :through}
  • (1)(1.11) SiK Radio v2(一)
  • (floyd+补集) poj 3275
  • (k8s中)docker netty OOM问题记录
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (ZT)一个美国文科博士的YardLife
  • (二)pulsar安装在独立的docker中,python测试
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (七)理解angular中的module和injector,即依赖注入
  • (四) Graphivz 颜色选择
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (五)MySQL的备份及恢复
  • (转)大型网站架构演变和知识体系
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记
  • .Net Memory Profiler的使用举例
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .Net(C#)自定义WinForm控件之小结篇
  • .NET/C# 检测电脑上安装的 .NET Framework 的版本
  • .net反编译工具
  • .NET建议使用的大小写命名原则
  • .net图片验证码生成、点击刷新及验证输入是否正确