如果只添加一个线程并且只删除一个(不同的)线程,是否需要同步缓冲区?

时间:2012-03-01 15:04:18

标签: java synchronization buffer

我有一个使用Buffers在线程之间传递对象的java应用程序。通常我使用BufferUtils同步这些缓冲区。如果我只有一个线程将对象添加到缓冲区,并且只添加,并且只有一个其他线程从缓冲区中删除对象,并且只删除;它们之间的缓冲区是否需要同步?

我现在遇到这样的情况,即有问题的两个线程是从spring bean实例化的,并且只能通过为它们都引用的缓冲区提供第三个bean来获取共享缓冲区。我无法弄清楚如何从bean创建一个同步缓冲区,因此有关是否有必要的问题。

3 个答案:

答案 0 :(得分:1)

也许您可以使用BlockingQueue传递这些对象。阻塞队列是线程安全的。此外,它还提供了几种可以很好地使用的put / get变体。 例如,放置的方法将使线程阻塞,直到队列中有足够的空间。 Offer方法,可以与超时一起使用,因此如果它没有设法添加到队列,它将返回false。

你可以看看 BlockingQueue

答案 1 :(得分:1)

是的,缓冲区需要同步。根据Java内存模型,如果多个线程在没有同步的情况下访问同一数据结构,则无法保证一个线程所做的更改对其他线程可见。某种形式的BlockingQueue应该可以解决问题。

答案 2 :(得分:1)

我会使用交换器。这允许两个线程交换到缓冲区(生产者是一个完整的缓冲区,而消费者是一个空的缓冲区)

http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Exchanger.html

关于交换器的文章,用于交换ByteBuffers。

http://vanillajava.blogspot.com/2011/09/exchange-and-gc-less-java.html