Semaphore使用案例
多執行緒程式設計是開發高併發應用的重點和難點,是許多網際網路公司面試環節必不可少的部分.打算圍繞多執行緒程式設計總結一些核心概念及它們之間的關係,本篇是Semaphore.
Semaphore
簡介
Semaphore是JDK1.5中引入的,中文一般譯為訊號量,我把它翻譯為訊號局.
許可證(permit)
permit是訊號局中非常重要的概念,一個執行緒只有從訊號局取得許可證才能擁有執行權.一個執行緒可以通過Semaphore的semaphore.acquire()
方法取得一張許可證,也可以通過semaphore.acquire(n)
取得n張許可證,如果訊號局剩下的許可證不足n張則執行緒會一直阻塞等待.有借當然有還,可以通過semaphore.release()
歸還1張許可證,也可以通過semaphore.release(n)
歸還n張許可證.
適用場景
系統中某類資源比較緊張,只能被有限的執行緒訪問,此時適合使用訊號量.
案例
案例
共有20個執行緒等待訪問主執行緒中的一個變數,但是該變數同時只能被最多3個執行緒訪問.
案例程式碼
主要為2個類,Visitor.java和VisitorTest.java.
Visitor.java程式碼如下:
package com.ms.thread.semaphore;
import java.util.concurrent.Semaphore;
/**
* @author chenxin
* @since 2018-04-20
*/
public class Visitor implements Runnable {
private Semaphore semaphore;
public Visitor(Semaphore sp) {
this.semaphore = sp;
}
@Override
public void run() {
try {
//必須取得許可證才能訪問主執行緒變數
semaphore.acquire();
} catch (InterruptedException e) {
e.printStackTrace();
}
//訪問主執行緒變數
System.out.println(Thread.currentThread().getName()+"拜訪主執行緒."+"主執行緒名字是:"+VisitorTest.name+". 剩餘許可證數量:"+semaphore.availablePermits());
//訪問完畢歸還許可證
semaphore.release();
}
}
VisitorTest.java程式碼如下:
package com.ms.thread.semaphore;
import java.util.concurrent.Semaphore;
/**
* 測試Visitor類
* @author chenxin
* @since 2018-04-20
*/
public class VisitorTest {
public static String name = "iengchen";
//定義訪問執行緒數量
private static int vistorNum = 20;
public static void main(String[] args) {
//定義許可證數量
Semaphore semaphore = new Semaphore(3);
for(int i=0; i<vistorNum; i++) {
new Thread(new Visitor(semaphore), "vistor-"+i).start();
}
}
}
案例執行結果
結果如下:
vistor-1拜訪主執行緒.主執行緒名字是:iengchen. 剩餘許可證數量:1
vistor-2拜訪主執行緒.主執行緒名字是:iengchen. 剩餘許可證數量:0
vistor-0拜訪主執行緒.主執行緒名字是:iengchen. 剩餘許可證數量:1
vistor-8拜訪主執行緒.主執行緒名字是:iengchen. 剩餘許可證數量:1
vistor-9拜訪主執行緒.主執行緒名字是:iengchen. 剩餘許可證數量:2
vistor-3拜訪主執行緒.主執行緒名字是:iengchen. 剩餘許可證數量:1
vistor-10拜訪主執行緒.主執行緒名字是:iengchen. 剩餘許可證數量:1
vistor-11拜訪主執行緒.主執行緒名字是:iengchen. 剩餘許可證數量:1
vistor-4拜訪主執行緒.主執行緒名字是:iengchen. 剩餘許可證數量:1
vistor-12拜訪主執行緒.主執行緒名字是:iengchen. 剩餘許可證數量:0
vistor-5拜訪主執行緒.主執行緒名字是:iengchen. 剩餘許可證數量:1
vistor-13拜訪主執行緒.主執行緒名字是:iengchen. 剩餘許可證數量:1
vistor-7拜訪主執行緒.主執行緒名字是:iengchen. 剩餘許可證數量:0
vistor-6拜訪主執行緒.主執行緒名字是:iengchen. 剩餘許可證數量:0
vistor-14拜訪主執行緒.主執行緒名字是:iengchen. 剩餘許可證數量:1
vistor-15拜訪主執行緒.主執行緒名字是:iengchen. 剩餘許可證數量:2
vistor-16拜訪主執行緒.主執行緒名字是:iengchen. 剩餘許可證數量:1
vistor-17拜訪主執行緒.主執行緒名字是:iengchen. 剩餘許可證數量:1
vistor-18拜訪主執行緒.主執行緒名字是:iengchen. 剩餘許可證數量:2
vistor-19拜訪主執行緒.主執行緒名字是:iengchen. 剩餘許可證數量:2
參考
相關文章
- Semaphore 使用&核心原理 圖解圖解
- Semaphore
- CyclicBarrier、CountDownLatch以及Semaphore使用及其原理分析CountDownLatch
- Semaphore解析
- Semaphore原始碼分析原始碼
- 呵呵,Semaphore,就這?
- Semaphore原始碼解析原始碼
- java原始碼-SemaphoreJava原始碼
- Semaphore最詳細解析
- 併發工具類——Semaphore
- GCD(四) dispatch_semaphoreGC
- 07 併發工具類CountDownLatch、CyclicBarrier、Semaphore使用及原始碼分析CountDownLatch原始碼
- Terraform使用案例ORM
- 10. Semaphore ||(訊號量)
- 使用訊號量Semaphore實現沒有飢餓問題的鎖
- 深入淺出Semaphore原始碼解析原始碼
- Semaphore訊號量原始碼解析原始碼
- 高併發之Semaphore、Exchanger、LockSupport
- Java併發系列—工具類:SemaphoreJava
- 淺談synchronized、Lock、ThreadLocal和semaphoresynchronizedthread
- Typescript註解使用案例TypeScript
- Linux awk使用案例教程Linux
- 原始碼分析:Semaphore之訊號量原始碼
- CountDownLatch、CyclicBarrier、Semaphore、Exchanger 的詳細解析CountDownLatch
- 併發模擬-程式碼CountDownLatch,SemaphoreCountDownLatch
- Java併發(6)- CountDownLatch、Semaphore與AQSJavaCountDownLatchAQS
- OpenCL中的SVM使用案例
- Chainlink Functions 介紹 & 使用案例AIFunction
- 使用MapReduce執行WordCount案例
- vuex-mapGetters使用案例解析Vue
- elasticsearch 的 update by query 使用案例Elasticsearch
- 第 57 期 sync/semaphore 原始碼淺析原始碼
- Java 併發工具類 CountDownLatch、CyclicBarrier、Semaphore、ExchangerJavaCountDownLatch
- Java併發之Semaphore原始碼解析(二)Java原始碼
- Java併發之Semaphore原始碼解析(一)Java原始碼
- 併發-6-wait、notify、Semaphore、CountDownLatch、CyclicBarrierAICountDownLatch
- Semaphore-訊號量的實現分析
- iOS GCD (四) dispatch_semaphore 訊號量iOSGC