2017-06-07 48 views
-1

我已經寫下了類,以瞭解SemaPhore。但結果是意外的。我無法理解SemaPhore的實際工作。它如何被用作鎖,信號和計數?無法理解或實現信號量

public class TrySemaPhore 
    { 
     public static void main(String[] args) { 
      ExecutorService executor = Executors.newFixedThreadPool(10); 
      Semaphore semaphore = new Semaphore(2); 
      Runnable newTask=() -> { 
       boolean permit = false; 
       try { 
        permit = semaphore.tryAcquire(); 
        if(permit) 
        System.out.println("doing work"); 
       } finally { 
        if(permit){ 
         semaphore.release(); 
         System.out.println("Work done!!"); 
        } 
       } 
      }; 
      for(int i=0; i<=4; i++){ 
       executor.submit(newTask); 
       } 
      stop(executor); 
     } 

     private static void stop(ExecutorService executor) { 
      /*code to stop executor*/ 
     } 
    } 

結果

doing work 
Work done!! 
doing work 
Work done!! 
doing work 
Work done!! 
doing work 
Work done!! 
doing work 
Work done!! 

我有線程的10個固定數。我有5個不同的任務(for循環)需要完成。我有2個許可證的信號量。我想理解Semaphore,它以一種非常簡單的方式獲益**(不像通過Google提供的理論)。

+0

不幸的例子。每個線程在'aquire()'後面都會發布許可證,所以很少有機會可以使用,並且可以看到並行工作。 在'aquire()'和'release()'之間添加'Thread.sleep(randomNumber)'。 –

回答

1

計數信號量。從概念上講,信號量維持一套 許可證。如果需要,每個獲取塊,直到獲得許可證 ,然後將其取出。每個版本都添加了一個許可證, 可能會釋放阻止的收單機構。

在獲得物品之前,每個線程必須從信號量獲得許可證,以確保物品可供使用。當 線程已完成該項目時,它將返回到 池,並且許可證返回到信號量,允許另一個 線程獲取該項目。請注意,在調用獲取時不會同步鎖定爲 ,因爲這會阻止將項目 返回到池中。信號量封裝了用於限制對池的訪問所需的同步,分開地, 與爲維持池本身的一致性所需的任何同步分開。一個無界隊列需要一個信號量(對隊列條目進行計數)和一個受互斥鎖保護的線程安全隊列(或等效的無鎖線程安全隊列)。信號量初始化爲零。生產者鎖定互斥鎖,將對象推入隊列,解鎖互斥鎖併發出信號。消費者等待信號量,鎖定互斥鎖,彈出對象並解鎖互斥鎖。

2.對象池,您可以使用信號量來限制資源的數量。多線程嘗試獲取池中的對象,並且您的對象數量有限,則某個線程將等待某些線程釋放。

class Pool { 
    private static final int MAX_AVAILABLE = 100; 
    private final Semaphore available = new Semaphore(MAX_AVAILABLE, true); 

    public Object getItem() throws InterruptedException { 
    available.acquire(); 
    return getNextAvailableItem(); 
    } 

    public void putItem(Object x) { 
    if (markAsUnused(x)) 
    available.release(); 
    } 
+0

計數和限制線程數?這是否僅僅是信號量的使用?請告訴我什麼時候使用信號量的基本用例或場景。試着告訴我信號量在哪裏的所有用例或場景。 –