當另一個線程將同步對象鎖定時,是否可以通過同步代碼塊?如果沒有,是否有替代方案可以採取這種方式?java並在另一個線程持有鎖時傳遞同步塊
2
A
回答
4
您可以用java.util.concurrent.locks.ReentrantLock
類替換塊。這個類提供了非常相似的互斥功能,但它也有方法tryLock
,如果它是空閒的,它會獲得鎖,或者如果它被採用,則立即返回false。
所以,你可以有這樣的:
// thread 1 has normal synchronized behavior
rlock.lock();
// code
rlock.unlock();
和線程2:
// thread 2 will skip the code if the lock is already taken
if(rlock.tryLock()) {
// code
rlock.unlock();
}
private final ReentrantLock rlock = new ReentrantLock();
碼線1
2
它可以用警衛對象完成。警衛對象具有這樣的功能:
鎖定警戒對象。
檢查是否設置了警戒標誌。如果是這樣,返回
false
,解鎖守衛對象。設置防護標誌。
返回
true
,解鎖警衛對象。
如果主叫方得到true
,它知道它可以在不與任何其他線程衝突的,因爲只有一個線程可以直到它被重新設置爲false
從false
保護標誌設置爲true
受保護對象進行操作,並其他線程只有在設置了防護標誌時才訪問該對象。
完成後,再鎖定在保護對象並清除保護標記,以允許在其他線程。
防護對象的鎖定可以,當然,是通過使用同步功能隱式的。通常你不會創建一個只是爲了防範的對象,而是摺疊與爲什麼需要將對象保護到守衛對象中相關的其他功能。
相關問題
- 1. 同步塊上的Java線程鎖
- 2. Java線程和同步塊
- 3. Java線程:同步塊
- 4. java線程同步塊
- 5. 一個線程可以同時持有兩個鎖嗎?
- 6. Java IllegalStateMonitorException同時持有鎖
- 7. 多個線程持有相同的鎖?
- 8. 淨線程 - 將一個線程鎖定所有同步塊單個鎖定對象
- 9. 線程併發 - 同步和鎖定。
- 10. 線程:同步塊
- 11. 當另一個線程可能存在或不存在時線程同步
- 12. Java同步鎖
- 13. 另一個線程內部的Java同步
- 14. 同步塊鎖定
- 15. 在java中發生線程同步時?
- 16. Java同步線程
- 17. Java線程同步
- 18. Java線程「同步」
- 19. 在java中同步線程
- 20. 在Java線程中同步
- 21. 同步,鎖定與廣播傳遞
- 22. 同時使用兩個線程訪問兩個同步塊
- 23. 如何將對象從主線程傳遞到java中的另一個線程
- 24. 以編程方式確定哪個Java線程持有鎖
- 25. 在Jmeter中將參數從一個線程傳遞到另一個線程
- 26. .NET Task.Result塊(同步)線程
- 27. Java中的監視器和同步塊(看起來兩個線程同時擁有一個監視器)
- 28. 如何鎖定一個線程,並等待鎖定將在另一個線程中釋放
- 29. Java鎖和解鎖不同的線程
- 30. 同步對象傳遞給線程與計時器