我想了解信號量,並知道信號量維護一套許可證或允許數目的鎖,但仍然有很多疑問。如果信號量如果多個線程試圖鎖定如何行爲
是否允許每個類或整個類本身的實例的鎖的數量保持不變?
我的意思是說,當信號量限制爲2,根據我的代碼,4線程如何獲得鎖。
這是否意味着每個類的實例都會保留許可證。如果是, 那麼它會不會在代碼的狀態中產生不一致?
在下面的代碼運行,輸出如下:
t1 having ts1 acqired lock
t2 having ts2 acqired lock
t3 having ts1 acqired lock
t4 having ts2 acqired lock
t1 having ts1 released lock
t4 having ts2 released lock
t3 having ts1 released lock
t2 having ts2 released lock
代碼:
public class SemaphoreTest {
public static void main(String[] args) {
Task ts1=new Task();
Task ts2=new Task();
Thread t1=new Thread(ts1,"t1 having ts1");
Thread t2=new Thread(ts2,"t2 having ts2");
Thread t3=new Thread(ts1,"t3 having ts1");
Thread t4=new Thread(ts2,"t4 having ts2");
t1.start();
t3.start();
t2.start();
t4.start();
}
}
class Task implements Runnable{
Semaphore noOfLocks=new Semaphore(2);
@Override
public void run() {
try {
noOfLocks.acquire();
System.out.println(Thread.currentThread().getName() +" acqired lock");
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}finally{
noOfLocks.release();
System.out.println(Thread.currentThread().getName() +" released lock");
}
}
}
你有兩個信號量,每個信號量允許兩個鎖。那是4.我在這裏看不到問題。 – biziclop
這不是我得到的輸出。你的信號量(其中2個)只有1個許可證。一次只能有一個線程訪問每個線程。 –
@biziclop我需要確認每個實例上是否保留允許的鎖的數量。由於我提到了2個鎖,並創建了2個對象,因此4個線程能夠獲取鎖。如果兩個線程獲得同一個對象的鎖定,那麼它們可能會通過嘗試更新同一個實例變量的值而產生一些不一致的狀態。 – user2800089