Нужно ли синхронизировать буфер, если добавляется только один поток и удаляется только один (другой) поток? - PullRequest
0 голосов
/ 01 марта 2012

У меня есть Java-приложение, которое использует буферы для передачи объекта между потоками.Обычно я синхронизирую эти буферы, используя BufferUtils.Если у меня есть только один поток, который добавляет объекты в буфер и только добавляет, и только один другой поток, который удаляет объекты из буфера и только удаляет;нужно ли синхронизировать буфер между ними?

Теперь у меня есть ситуация, когда два рассматриваемых потока создаются из пружинных бинов и могут получить в общий буфер только наличие третьего бина для буферачто они оба ссылаются.Я не мог понять, как сделать синхронизированный буфер из bean-компонента, поэтому возник вопрос, нужно ли это или нет.

Ответы [ 3 ]

1 голос
/ 01 марта 2012

Да, буфер нужно будет синхронизировать.Согласно модели памяти Java, если более чем один поток обращается к одной и той же структуре данных без синхронизации, нет гарантии, что изменения, сделанные одним потоком, будут видны другим потокам.Некоторая форма BlockingQueue должна сработать.

1 голос
/ 01 марта 2012

Я бы использовал обменник. Это позволяет двум потокам переключаться в буферы (производитель - полный буфер, а потребитель - очищенный буфер)

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

1 голос
/ 01 марта 2012

Возможно, вы могли бы использовать BlockingQueue для передачи этих объектов.И очередь блокировки является поточно-ориентированной.Кроме того, он предлагает несколько вариантов пут / получить, которые можно использовать красиво.Например, метод put блокирует поток до тех пор, пока в очереди не будет достаточно места.Метод предложения можно использовать с таймаутом, поэтому, если ему не удастся добавить в очередь, он вернет false.

Вы можете проверить его BlockingQueue

...