[英]Passing objects between threads
我有用於生成對象並將其推入線程安全Set
的工作線程。 處理線程定期讀取Set
並處理元素。
盡管可以成功地從集合中檢索對象引用本身,但是如果從處理線程進行訪問,則對象的變量不是線程安全的。 除了使所有對象的內部volatile
等以外,是否還有其他模式可以使用? 將來,這些對象可能會變得更加復雜,其中包含嵌套的對象等。
假設一旦放置到Set
就不會從外部修改任何對象,那么在我開始處理Set
之前,是否有某種方法可以“先於發生”? 處理線程已經運行和唯一的后不會被創建Set
已被填充。
對象本身只是數據容器,沒有固有的線程安全性。 我無法將所有字段都設為final,因為在將它們放入Set
之前,可能需要對其進行多次修改。
如果設置了線程安全,則此操作將在寫操作之前建立,因此您不必擔心對象是否是線程安全的。 這假定您的生產者在將對象放入集合后不會對其進行更改或讀取。
如果使對象不可變,這將使關系更清晰,但是我假設一旦將對象傳遞給共享存儲,寫入線程就不再會更改對象,只有消耗者線程讀取或更改對象。
順便說一句,我會使用ExecutorService通過隊列傳遞任務,因為它效率更高且為您編寫。
在這種情況下,波動性並不是萬靈葯。 查看在線程之間傳遞的那些對象切換到不可變對象的可能性。 此外,基於隊列的線程安全數據結構將為您提供比大多數集合實現更好的性能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.