如果只有一個閱讀器和一個寫入器,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. FIFO隊列鏈表實現
- 6. 原型JavaScript Ajax FIFO隊列
- 7. Java FIFO隊列實現
- 8. 使用同步塊的同步隊列
- 9. C#線程隊列同步
- 10. 作爲「FIFO隊列」的Javascript循環緩衝區隊列實現
- 11. Java溢出到磁盤的FIFO隊列
- 12. Haskell中:FIFO隊列算法複雜
- 13. 基於FIFO的隊列實現?
- 14. AWS Kinesis Stream作爲FIFO隊列
- 15. pthread_cond_wait fifo循環隊列中的死鎖
- 16. 靜態FIFO隊列與計時器c#
- 17. Spring集成:一個FIFO隊列
- 18. 用雲信息創建FIFO SQS隊列
- 19. 同步FIFO緩衝區的使用
- 20. 通過FIFO進入同步功能
- 21. 德爾菲隊列和同步參數
- 22. 瞭解同步並實現隊列
- 23. CCUserDefault flush,CFPreferences後臺同步隊列
- 24. Java中是否存在同步隊列?
- 25. MSMQ同步寫入遠程隊列
- 26. CFPreferences後臺同步隊列墜毀
- 27. 我不能讓隊列同步在c#
- 28. Java/Android:同步vs隊列實現
- 29. 最佳線程同步隊列
- 30. AWS SQS標準隊列或FIFO隊列何時不能重複消息?