信號量

信號量是操做系統提供給用戶使用的一種機制,幫助用戶進程協調使用資源,用戶編程的時候能夠直接調用,沒必要本身設計。計算機對信號量只能執行 wait和signal這兩種原子(sychronized)操做,即申請和釋放信號量時沒法被打斷。編程

信號量多用於進程間的同步與互斥,簡單的說一下同步和互斥的意思併發

同步:指散步在不一樣任務之間的若干程序片段,它們的運行必須嚴格按照規定的某種前後次序來運行,這種前後次序依賴於要完成的特定的任務。函數

互斥:不一樣任務之間的若干程序片段,當某個任務運行其中一個程序片斷時,其它任務就不能運行它們之中的任一程序片斷,只能等到該任務運行完這個程序片斷後才能夠運行操作系統

競爭:當併發進程競爭使用同一個資源的時候,咱們就稱爲競爭進程線程

顯然同步是一種更爲複雜的互斥,而互斥是一種特殊的同步。也就是說互斥是兩個任務之間不能夠同時運行,他們會相互排斥,必須等待一個線程運行完畢,另外一個才能運行,而同步也是不能同時運行,但他是必需要安照某種次序來運行相應的線程(也是一種互斥)!所以互斥具備惟一性和排它性,但互斥並不限制任務的運行順序,即任務是無序的,而同步的任務之間則有順序關係。設計

對於信號量,能夠認爲是一個倉庫,有兩個概念,容量和當前的貨物個數。
P操做從倉庫拿貨,若是倉庫中沒有貨(if(signal==0)),線程一直等待(wait),直到V操做,往倉庫裏添加了貨物,而後從倉庫拿貨(--signal)爲了不P操做一直等待下去,會有一個超時時間。進程

V操做,若是倉庫滿了(if(signal==bound)),線程等待(wait),直到有P操做,從倉庫中拿走貨物,有空的位置,往倉庫送貨(++signal)。資源

建立信號量,設置容量,先有V操做,才能P操做。
P操做:貨物個數減1,減過以後,貨物個數大於等於0,說明已經拿到貨物,線程繼續。否者線程阻塞。同步

V操做:貨物個數加1,加過以後,貨物個數小於等於容量,說明添加成功,線程繼續。否者線程阻塞。it

JDK1.5已經實現了Semaphore類,無須再本身實現。
構造函數須要指定信號量的容量,可選指定是否公平,以防止低優先級線程的飢餓狀態。
Semaphore(int permits) 建立具備給定的許可數和非公平的公平設置的 Semaphore。
Semaphore(int permits, boolean fair) 建立具備給定的許可數和給定的公平設置的 Semaphore。

相關文章
相關標籤/搜索