Semaphore 信號量

一、Semaphore 簡介

1)Semaphore類其實就是synchronized關鍵字的升級版,這個類主要做用就是控制線程併發的數量。Semaphore能夠維護當前訪問自身的線程個數,而且提供了同步機制。使用Semaphore能夠控制
同時訪問資源的線程個數。例如,實現一個文件容許的併發訪問數:如如今只容許3個併發同時讀取文件,但如今有10個線程須要訪問, 只有當那3個線程中任何一個訪問完畢後,其餘7個線程數中的其中一個才能去訪問。java

2)單個信號量的Semaphore對象能夠實現互斥鎖的功能(Semaphore sp = new Semaphore(1);),而且能夠是由一個線程得到了「鎖」,再由另一個線程釋放「鎖」,這能夠應用與死鎖恢復的一些場合。併發

3)Semaphore有兩種模式,公平模式和非公平模式。公平模式就是調用acquire的順序就是獲取許可證的順序,遵循FIFO;而非公平模式是搶佔式的,也就是有可能一個新的獲取線程剛好在一個許可證釋放時獲得了這個許可證,而前面還有等待的線程,簡單的說就是隨機選取新線程來運行。dom

二、Semaphore demoide

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;

/**
 * Semaphore 信號量Demo
 *
 */
public class SemaphoreTest {

	public static void main(String[] args) {
		ExecutorService service = Executors.newCachedThreadPool();
		// 建立信號量,數量爲3
		final Semaphore sp = new Semaphore(3);
		// 開啓10個線程
		for (int i = 0; i < 10; i++) {
			Runnable runnable = new Runnable() {
				@Override
				public void run() {
					try {
						// 得到信號量
						sp.acquire();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					System.out.println("線程" + Thread.currentThread().getName() + "當前已有" + (3 - sp.availablePermits() + "個併發"));
					try {
						// 模仿線程操做
						Thread.sleep((long) (Math.random() * 10000));
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					System.out.println("線程" + Thread.currentThread().getName() + "即將離開");
					// 釋放信號
					sp.release();
					System.out.println("線程" + Thread.currentThread().getName() + "已離開,當前已有" + (3 - sp.availablePermits() + "個併發"));
				}
			};
			// 執行線程
			service.execute(runnable);
		}
	}
}

運行結果圖:ui

相關文章
相關標籤/搜索