1. 程式人生 > >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";
    }

}

執行的結果圖(以極快的手速一起呼叫介面進行訪問):

 

 

簡單解析:

我在程式碼裡面設定的可用的資源包是:

//定義資源包的總數 只有2個
Semaphore semaphore=new Semaphore(2);
//設定這個介面可用的資源數
int availablePermits=semaphore.availablePermits();

然後這個整體的執行流程就是這樣:

一個請求呼叫介面,那麼就會先去判斷資源包還有沒有?

如果有,那就搶;搶到了,就開始使用!且,此刻可用的總資源包就-1  :

//請求佔用一個資源
semaphore.acquire(1);

如果沒有,那就直接返回了提示,就是說資源緊張~

然後在搶到資源包開始使用的時候,我們可以看到控制檯輸出了一下,資源正在被使用,顧名思義(就是說有人在使用咯,當然你可以擴充套件,作為日誌跟蹤,我之前的部落格有介紹怎麼獲取請求者的IP地址也有怎麼生成日誌等等,反正可以自己擴充套件)

然後在使用完畢的時候,就釋放資源包,

//釋放一個資源
semaphore.release(1);

那麼如果剛好這時候有請求過來了,那就可以申請使用資源包了。

 

結合我的執行結果:

我一共設定2個可用資源包,然後同時跑起來5個請求, 然後就看到了前面2個請求都搶到了資源,後面的都顯示資源緊張。

 

 

嗯,簡單的使用介紹就這樣了。 當然如果感興趣這個玩意,推薦去再瞭解下限流 漏桶演算法和令牌桶演算法。