標籤:
Semaphore(訊號量)充當了作業系統概念下的“訊號量”。它提供了“臨界區中可用資源訊號量”的相同功能。
以一個停車場運作為例。為了簡單起見,假設停車場只有三個車位,一開始三個車位都是空的。這時如果同時來了五輛車,看門人允許其中三輛不受阻礙的進入,然後放下車攔,剩下的車則必須在入口等待,此後來的車也都不得不在入口處等待。這時,有一輛車離開停車場,看門人得知後,開啟車攔,放入一輛,如果又離開兩輛,則又可以放入兩輛,如此往複。
在這個停車場系統中,車位是公用資源(臨界區資源),每輛車好比一個線程,看門人起的就是訊號量的作用。
更進一步,訊號量的特性如下:訊號量是一個非負整數(車位元),所有通過它的線程(車輛)都會將該整數減一(通過它當然是為了使用資源),當該整數值為零時,所有試圖通過它的線程都將處於等待狀態。在訊號量上我們定義兩種操作: acquire(擷取資源) 和 Release(釋放資源)。 當一個線程調用acquire(擷取資源)操作時,它要麼通過然後將訊號量減一,要麼一直等下去,直到訊號量大於一或逾時。Release(釋放)實際上是在訊號量上執行加操作,對應於車輛離開停車場,該操作之所以叫做“釋放”是因為加操作實際上是釋放了由訊號量守護的資源。
package com.lt.thread.SamephoreTest;import java.util.concurrent.Semaphore;/** * Created by ltao on 2015-2-9. */public class Parking implements Runnable { private int count; private Semaphore semaphore; public int getCount() { return count; } public void setCount(int count) { this.count = count; } public Semaphore getSemaphore() { return semaphore; } public void setSemaphore(Semaphore semaphore) { this.semaphore = semaphore; } public Parking(int count) { this.count=count; this.semaphore=new Semaphore(count); } public void parking() { try { semaphore.acquire(); try { Thread.sleep(100); System.out.println(Thread.currentThread().getName()+" find a paking space"); } catch (InterruptedException e) { e.printStackTrace(); } } catch (InterruptedException e) { e.printStackTrace(); } finally { System.out.println(Thread.currentThread().getName()+" release a paking space"); semaphore.release(); } } @Override public void run() { this.parking(); } public static void main(String[] args) { Parking parking=new Parking(5); Thread[] threads=new Thread[13]; for (int i=0;i<threads.length;i++) { threads[i]=new Thread(parking,"thread"+i); } for (int i=0;i<threads.length;i++) { threads[i].start(); } }}
java中的訊號量Semaphore