Semaphore使用案例

weixin_33762321發表於2018-04-22

多執行緒程式設計是開發高併發應用的重點和難點,是許多網際網路公司面試環節必不可少的部分.打算圍繞多執行緒程式設計總結一些核心概念及它們之間的關係,本篇是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

參考

相關文章