Springboot 執行緒同步之Semaphore 資源包的簡單使用
阿新 • • 發佈:2018-11-30
如果你有一個東西, 你想別人觸碰它的時候,不能同時觸碰,需要按照你想要的每次多少人來觸碰。
算了,不做比喻了,程式碼原理其實也簡單,我們直接先看程式碼,我再做簡單的解釋(估計不用看解釋也能懂):
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個請求都搶到了資源,後面的都顯示資源緊張。
嗯,簡單的使用介紹就這樣了。 當然如果感興趣這個玩意,推薦去再瞭解下限流 漏桶演算法和令牌桶演算法。