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

简介: 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";
    }
}


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


image.png


简单解析:


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


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


//设置这个接口可用的资源数
int availablePermits=semaphore.availablePermits();


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


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


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


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


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


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


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


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


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


结合我的运行结果:


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


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

相关文章
|
1月前
|
Python
如何在Python中使用Semaphore来实现线程同步?
如何在Python中使用Semaphore来实现线程同步?
31 7
|
1月前
|
Java 调度 Spring
SpringBoot实现多线程定时任务动态定时任务配置文件配置定时任务
SpringBoot实现多线程定时任务动态定时任务配置文件配置定时任务
318 0
|
1月前
|
安全 Java easyexcel
【二十七】springboot实现多线程事务处理
【二十七】springboot实现多线程事务处理
148 0
|
13天前
|
API
java-多线程-CountDownLatch(闭锁) CyclicBarrier(栅栏) Semaphore(信号量)-
java-多线程-CountDownLatch(闭锁) CyclicBarrier(栅栏) Semaphore(信号量)-
13 1
|
14天前
|
设计模式 NoSQL Java
网易面试:SpringBoot如何开启虚拟线程?
虚拟线程(Virtual Thread)也称协程或纤程,是一种轻量级的线程实现,与传统的线程以及操作系统级别的线程(也称为平台线程)相比,它的创建开销更小、资源利用率更高,是 Java 并发编程领域的一项重要创新。 > PS:虚拟线程正式发布于 Java 长期支持版(Long Term Suort,LTS)Java 21(也就是 JDK 21)。 虚拟线程是一种在 Java 虚拟机(JVM)层面实现的逻辑线程,不直接和操作系统的物理线程一一对应,因此它可以减少上下文切换所带来的性能开销。 操作系统线程、普通线程(Java 线程)和虚拟线程的关系如下: ![image.png](https:
26 0
网易面试:SpringBoot如何开启虚拟线程?
|
29天前
|
安全 Java API
多线程(JUC, ReentrantLock, 原子类, 线程池, 信号量 Semaphore, CountDownLatch)
多线程(JUC, ReentrantLock, 原子类, 线程池, 信号量 Semaphore, CountDownLatch)
30 4
|
12天前
|
Java Spring
SpringBoot 中的线程池,你真的会用么?
SpringBoot 中的线程池,你真的会用么?
12 0
|
1月前
|
Java
Java一分钟之-并发编程:线程间通信(Phaser, CyclicBarrier, Semaphore)
【5月更文挑战第19天】Java并发编程中,Phaser、CyclicBarrier和Semaphore是三种强大的同步工具。Phaser用于阶段性任务协调,支持动态注册;CyclicBarrier允许线程同步执行,适合循环任务;Semaphore控制资源访问线程数,常用于限流和资源池管理。了解其使用场景、常见问题及避免策略,结合代码示例,能有效提升并发程序效率。注意异常处理和资源管理,以防止并发问题。
42 2
|
1月前
|
Java C++ Spring
谈谈springboot里面的守护线程与本地线程
【4月更文挑战第18天】在Spring Boot中,线程的概念同Java标准线程模型一致,即区分为守护线程和用户线程。Spring Boot本身并不直接提供创建守护线程或用户线程的特殊机制,但它允许你通过标准Java方式或者利用Spring的框架特性来管理这些线程
105 2
|
1月前
|
监控 Java Spring
Spring Boot中一般如何使用线程池?
在Spring Boot应用程序中,合理地使用线程池可以有效地提高系统的性能和并发处理能力。本文将深入探讨Spring Boot中如何一般性地使用线程池,包括线程池的配置、使用方式以及一些最佳实践。
148 0