我想创建一个系统,其中一个线程A将项目添加到一个缓冲区,然后另一个线程B负责读取它们输入的确切顺序的项目,然后做一些潜在的长期操作他们。同步FIFO缓冲区的使用
我最好的猜测:
Class B extends Thread {
Buffer fifo = BufferUtils.synchronizedBuffer(new BoundedFifoBuffer());
add(Object o) { // Thread A calls me, and doesn't deal well with delays :)
fifo.add(o); // will the sync below prevent this from happening?
// or can .add be independent of the sync ?
}
run() {
synchronized (fifo) { // why am i sync'd here? I am the only thread accessing...
while (item in buffer) { // also how do i check this, and block otherwise?
process(fifo.remove());
}
}
|
}
正如你所看到的,我甚至完全肯定是否同步是必要的。线程安全问题与get()访问无关,因为只有一个线程访问它,但最重要的是什么重要的是线程A在线程期间调用没有任何并发访问异常的.add() B处理缓冲区的内容。
也许我正在反思这个?与人在一起安全吗?非常感谢您对这个问题的评价。
真诚,
周杰伦
确实有兴趣,但我的问题仍然存在:一个线程可以将队列add()添加到队列中,而另一个将队列remove()从队列中移除而没有任何并发访问问题? – Phaedrus
使用BlockingQueue的答案是肯定的,它是线程安全的,因此您不必担心同步。 您可以阅读文档http://download.oracle.com/javase/6/docs/api/java/util/concurrent/BlockingQueue.html:“BlockingQueue实现是线程安全的。” –
这是exacly我需要什么,谢谢。 - LinkedBlockingQueue –
Phaedrus