如果只有一个阅读器和一个写入器,FIFO队列应该同步吗?
答案 0 :(得分:4)
“同步”是什么意思?如果你的读者和writer在单独的线程中,您希望FIFO“正确”处理并发,包括以下详细信息:
在Java世界中有一本很好的书,Java Concurrency In Practice。有多种方法可以实现正确处理并发的FIFO。最简单的实现是阻塞,更复杂的实现使用基于大多数处理器上的比较和交换指令的非阻塞算法。
答案 1 :(得分:2)
是的,如果读写器与来自不同线程的FIFO队列进行交互。
答案 2 :(得分: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;
}
}
答案 3 :(得分:0)
取决于实施,但最有可能。您不希望读者阅读部分书面数据。
答案 4 :(得分:0)
是的,除非其文件另有明确说明。
(如果只有一个读取器和一个写入器线程,则可以实现不需要同步的专用FIFO,例如在使用InterlockedXXX功能的Windows上。)