2014-01-08 67 views
-1

我的代碼:信號燈在Java中

public class t3 { 

static int i = 1; 

public static void main(String[] args) throws InterruptedException { 
    Semaphore sem = new Semaphore(1); 
    sem.release(); 
    System.out.println(i++); //1 then ++ 
    sem.release(); 
    System.out.println(i++); //2 
    sem.acquire(); 
    System.out.println(i++); //3 
    sem.acquire(); 
    System.out.println(i++); //4 
    sem.acquire(); 
    System.out.println(i++); //5 
    sem.acquire(); 
    System.out.println(i++); //6 
    sem.acquire(); 
    System.out.println(i++); //7 
    } 
} 

我的輸出:

1 
2 
3 
4 
5 

爲什麼不喜歡這樣的:?

1 
2 
3 
4 
5 
6 
7 
+0

@ZouZou:我不知道要麼,但它是在這裏:http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Semaphore.html –

+0

OK傢伙,我的壞:)不知道它存在。 –

+1

我不明白的是「什麼不清楚信號量?」 :) –

回答

1

信號量是權限池。在啓動

Semaphore sem = new Semaphore(1) 

只包含一個權限,但既然你用release兩次你增加了兩個,因此他們已共3個。接下來,您調用acquire五次,但由於在信號量中只有三個權限,所以acquire的第四次調用使您的線程等待可用權限。

爲了看得更清楚看一看評論在此代碼

Semaphore sem = new Semaphore(1); // 1 permission available 
sem.release();     // 2 permissions available after this method 
System.out.println(i++); // 1 then ++ 
sem.release();     // 3 permissions available after this method 
System.out.println(i++); // 2 
sem.acquire();     // 2 permissions available after this method 
System.out.println(i++); // 3 
sem.acquire();     // 1 permission available after this method 
System.out.println(i++); // 4 
sem.acquire();     // 0 permissions available after this method 
System.out.println(i++); // 5 

sem.acquire();     // now thread needs to wait for available permission 
System.out.println(i++); // 6 
sem.acquire(); 
System.out.println(i++); // 7 
1

我想許可證計數器是這樣的:0,-1,-2,-1,0,1然後塊。因爲你有一個可用的許可證。看起來,許可證計數器反過來工作,它從1開始,然後像1,2,3,2,1,0和塊。 (謝謝@JB Nizet)

+0

這是另一種方式:1,2,3,2,1,0 - >阻塞。 relase()添加一個許可證。 acquire()獲取一個並減少許可證的數量,或者如果沒有可用的數據塊則減少數量。 –

1

你應該注意到你的過程沒有完成,它停留在觀望狀態。
運行下面的代碼版本並更改傳遞給Semaphore構造函數的初始值,您應該能夠了解行爲。
您應該注意到,每次調用release()時,都會增加可用許可數 ,並且每次調用acquire()時都會減少池的大小。

public static void main(String[] args) throws InterruptedException { 
    Semaphore sem = new Semaphore(1); 

    sem.release(); 
    System.out.println(sem.availablePermits() + ":" + i++); //1 then ++ 
    sem.release(); 
    System.out.println(sem.availablePermits() + ":" + i++); //2 
    sem.acquire(); 
    System.out.println(sem.availablePermits() + ":" + i++); //3 
    sem.acquire(); 
    System.out.println(sem.availablePermits() + ":" + i++); //4 
    sem.acquire(); 
    System.out.println(sem.availablePermits() + ":" + i++); //5 
    sem.acquire(); 
    System.out.println(sem.availablePermits() + ":" + i++); //6 
    sem.acquire(); 
    System.out.println(sem.availablePermits() + ":" + i++); //7 
    } 
}