2012-03-01 15 views
0

我哈瓦使用緩衝器圍繞線程之間傳遞對象的Java應用程序。通常我使用BufferUtils同步這些緩衝區。如果我只有一個將對象添加到緩衝區的線程,並且只添加了一個線程,並且只有一個線程將對象從緩衝區中刪除,並且僅刪除;它們之間的緩衝區是否需要同步?如果只有一個線程添加並且只有一個(不同)線程刪除,您是否需要同步緩衝區?

我現在有一個情況有關的兩個線程都從春豆實例化,並且只能由具有它們都參考緩衝區中的第三個bean得到他們的手共享緩存。我無法弄清楚如何從一個bean創建一個同步緩衝區,因此這個問題是否有必要。

回答

1

也許你可以使用一個BlockingQueue的是傳遞這些對象。阻塞隊列是線程安全的。另外它提供了幾個可以很好地使用的put/get變體。例如,放入的方法會使線程阻塞,直到隊列中有足夠的空間。 招募方法,可以用超時使用,所以如果不設法添加到隊列中,將返回false。

你可以檢查出來 BlockingQueue

+0

謝謝,這正是我所需要的。另外,它確實有一些非常好的超時添加對象的方法,布爾返回而不是捕獲BufferOverflow。非常好,謝謝! – tdimmig 2012-03-01 17:39:45

+0

這幾乎是第二個問題,但幾乎沒有值得做一個全新的職位。你知道BlockingQueue與BufferUtils同步的緩衝區的性能如何進行比較嗎? – tdimmig 2012-03-01 19:51:16

+0

很抱歉的(非常)晚的答覆..那麼你真的應該以肯定知道運行一些測試。我的觀點是BlockingQueue變種寫得很好,效率很高。如果我沒有弄錯,它們是在Java 5中添加的併發包的一部分。但最後,你應該做一些測試並做一些測量,看看你用的方式是否適合你。您可能想查看可用的類並從Array返回或LinkedList支持的隊列中進行選擇。有關詳細信息,請參閱上述文檔。歡呼聲,提比尤 – 2012-03-17 19:45:42

1

是緩衝區將需要同步。按照Java內存模型,如果多個線程在沒有同步的情況下訪問相同的數據結構,則不能保證一個線程所做的更改對其他線程可見。 BlockingQueue的某種形式應該可以做到。

相關問題