我有一个使用Buffers在线程之间传递对象的java应用程序。通常我使用BufferUtils同步这些缓冲区。如果我只有一个线程将对象添加到缓冲区,并且只添加,并且只有一个其他线程从缓冲区中删除对象,并且只删除;它们之间的缓冲区是否需要同步?
我现在遇到这样的情况,即有问题的两个线程是从spring bean实例化的,并且只能通过为它们都引用的缓冲区提供第三个bean来获取共享缓冲区。我无法弄清楚如何从bean创建一个同步缓冲区,因此有关是否有必要的问题。
答案 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