如果只有一个阅读器和一个写入器,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队列何时不能重复消息?