如果只有一個閱讀器和一個寫入器,FIFO隊列應該同步嗎?FIFO隊列同步
Q
FIFO隊列同步
0
A
回答
4
你所說的「同步」的意思?如果你的讀者&作家是在單獨的線程,你想要的FIFO爲「正確」處理併發,包括這些細節:
- 正確使用FIFO API的不應該導致數據結構被破壞
- 正確使用FIFO API不應導致死鎖(儘管應該有一個機制讓讀者等到有東西要讀)
- 從FIFO中讀取的對象應該是相同的對象,以相同的順序寫入先進先出(不應該有丟失的對象或重新安排的順序)
- 應該有一個有界時間(人們會希望!)在作者將什麼東西放入FIFO中以及何時可供讀者使用。
在Java世界裏有一本好書,Java Concurrency In Practice。有多種方法可以實現正確處理併發性的FIFO。最簡單的實現是阻塞,更復雜的實現使用基於大多數處理器上的比較和交換指令的非阻塞算法。
2
是的,如果讀寫器與來自不同線程的FIFO隊列交互。
0
取決於實施,但最有可能的。你不希望讀者讀取部分寫入的數據。
0
是的,除非其文件另有明確說明。
(這是可能的,如果有使用InterlockedXXX功能只有一個閱讀器和一個寫線程,例如,在Windows上實現一個專門的FIFO,這並不需要同步。)
1
嘗試併發FIFO使用此代碼:
public class MyObjectQueue {
private static final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
private static final ReadLock readLock;
private static final WriteLock writeLock;
private static final LinkedList<MyObject> objects;
static {
readLock = lock.readLock();
writeLock = lock.writeLock();
objects = new LinkedList<MyObject>();
}
public static boolean put(MyObject p) {
writeLock.lock();
try {
objects.push(p);
return objects.contains(p);
} finally {
writeLock.unlock();
}
}
public static boolean remove(MyObject p) {
writeLock.lock();
try {
return objects.remove(p);
} finally {
writeLock.unlock();
}
}
public static boolean contains(MyObject p) {
readLock.lock();
try {
return objects.contains(p);
} finally {
readLock.unlock();
}
}
public MyObject get() {
MyObject o = null;
writeLock.lock();
try {
o = objects.getLast();
} catch (NoSuchElementException nse) {
//list is empty
} finally {
writeLock.unlock();
}
return o;
}
}
相關問題
- 1. 使用FIFO等待隊列的Linux同步
- 2. 同步隊列
- 3. Amazon Sqs FIFO隊列
- 4. FIFO隊列鏈表實現
- 5. Firebase中的FIFO隊列
- 6. 原型JavaScript Ajax FIFO隊列
- 7. Java FIFO隊列實現
- 8. NSOperationQueue串行FIFO隊列
- 9. FIFO隊列顯示問題
- 10. 實現一個隊列(fifo)
- 11. 目標C - 手動排隊FIFO隊列
- 12. 使用同步塊的同步隊列
- 13. AJAX:同步或隊列?
- 14. 同步循環隊列
- 15. C#線程隊列同步
- 16. 作爲「FIFO隊列」的Javascript循環緩衝區隊列實現
- 17. 將元素添加到fifo隊列
- 18. aws fifo隊列無法接收messageGroupID
- 19. MongoDB FIFO與紅寶石隊列
- 20. 我自己的消息隊列/ fifo
- 21. 如何使用couchbase作爲FIFO隊列
- 22. Elixir簡單,高效的FIFO隊列
- 23. 用雲信息創建FIFO SQS隊列
- 24. Spring集成:一個FIFO隊列
- 25. 基於FIFO的隊列實現?
- 26. Haskell中:FIFO隊列算法複雜
- 27. 在c中創建一個FIFO隊列
- 28. AWS Kinesis Stream作爲FIFO隊列
- 29. 如何保證azure隊列FIFO
- 30. Java溢出到磁盤的FIFO隊列