我想要一個Java中的Mutex,它讓我在一個線程中等待它,並在另一個線程中釋放它。我知道我可以使用容量爲1的信號量,但問題是「acquire()」方法會拋出「InterruptedException」。在Java中有什麼特別的同步方式可以達到這個目的嗎?Java中互斥線程的互斥量?
回答
幸運的是,信號量提供了這種方法對你:)
public void acquireUninterruptibly()
從此信號量獲取許可證,阻塞,直到有一個是可用的 。獲取許可證(如果有),並立即返回 ,將可用許可證的數量減少一個。
如果沒有許可證是可用的,則當前線程用於 線程調度目的,禁止,直到其他線程 調用此信號量和當前線程 是下一個要被分配許可的釋放()方法處於休眠狀態。
如果在等待許可,然後 它將繼續等待當前線程被中斷,但在該線程分配 時間的許可證可以改變相比,它會接收到的時間的 許可證沒有發生中斷。當線程從 這個方法返回時,其中斷狀態將被設置。
如果你有一個線程將要等待的代碼,那麼除非你使用同步塊,否則你一定要處理中斷的異常。另外,中斷異常有什麼問題?
InterruptedException
不是問題,只是把它包在一個循環:
while(true) {
try {
semaphore.acquire();
break;
} catch(InterruptedException e) {
//swallow, continue;
}
}
但是這個代碼是不是很安全,優雅,但將努力爲您提供您「要確保你能獲得允許!「
如果在catch子句中完成Thread.currentThread()。interrupt(),我會說它幾乎是處理這個問題的最好方法(除了使用acquireUninterruptibly方法)。 –
的ThreadA
volatile boolean waitCondition = true
synchronized(lockObject) {
while (waitContidion) {
lockObject.wait();
}
}
ThreadB
synchronized(lockObject) {
waitCondition = false;
lockObject.notifyAll();
}
或鎖定實例使用條件/信號。
InterruptedException的正確處理是非常重要的,至少你必須設置它的中斷標誌與Thread.currentThread()。中斷()在catch塊的方法。
- 1. 互斥或不互斥互斥?
- 2. Java互斥
- 3. 線程和互斥體
- 4. SQLite多線程互斥體
- 5. boost線程互斥陣列
- 6. 互斥與並行線程
- 7. 互斥和線程獨立
- 8. 多線程和互斥鎖
- 9. 線程同步,互斥
- 10. 多線程互斥鎖可以使用多個互斥鎖
- 11. 提升interprocess互斥體vs提升線程互斥體
- 12. JAVA中的互斥量和信號量?
- 13. 互斥
- 14. 互斥
- 15. GNU Make中的互斥量?
- 16. 將非互斥變量重新編碼爲互斥變量
- 17. 互斥多進程
- 18. Python線程中的信號或互斥
- 19. Linux中的互斥進程
- 20. 在java中獲取win32互斥量
- 21. 信號量與互斥量
- 22. 與smp的Java互斥體
- 23. 爲什麼互斥體不需要互斥體(並且該互斥體需要互斥體...)
- 24. 使NSOperations互斥
- 25. 互斥理解
- 26. Posix Pthread互斥
- 27. 與互斥
- 28. 互斥對象
- 29. 互斥並行
- 30. 使用互斥
爲什麼中斷的異常可能會被拋出? –
在任何舊對象上使用同步塊都有問題嗎? – Wug
@enno Shioji:我想確保我可以獲得許可證! – moorara