2012-02-16 66 views
3

我正在使用第三方專有庫(無源代碼)創建非線程安全組件的實例。這是否意味着我不應該使用多個線程並行地運行作業?在自己的JVM中運行每個作業都讓我想起了它,但是過度使用它。Java併發:替代多線程(使用非線程安全環境)

然後我在這裏閱讀文章

http://cscarioni.blogspot.com/2011/09/alternatives-to-threading-in-java-stm.html

最好先請按照文章的建議嗎?那裏還有什麼其他的選擇?

迴應馬丁詹姆斯:

供應商告訴我,只有一個線程在該組件的多個實例存在(工廠模式創建的組件實例),每個實例獨立控制從它的API。

那麼這是否意味着我仍然可以在控制在一個大線程中運行的每個組件實例的同時使用多個線程?

+1

'創建非線程安全組件的實例'不一定意味着該庫不能用於多個線程 - 也許它只是爲每個線程創建一個組件。文檔和/或供應商說什麼? – 2012-02-16 11:40:05

回答

2

不,這並不意味着這一點。 這意味着你應該關心自己的數據保護。一種可能的方法是在調用它的代碼中同步對該庫的訪問(您的代碼)。其他可能的方法是使用不可變對象(例如,每次要使用非線程安全數據結構時都要創建私有副本)。

其他方法是設計你的應用程序,使用特定對象的代碼總是運行在同一個線程中。這並不意味着與其他對象(甚至是同一個類)的代碼無法運行int其他線程。所以,系統是多線程的,但不會產生數據衝突。

+0

原生的java風格同步使用'synchronized'塊/方法完成,但是'java.util.concurrency'包爲線程管理增加了很多非常強大的工具。 – AlexR 2012-02-21 07:24:43

-2

這一切都取決於你的代碼實際上是在用組件做什麼。例如,ArrayList不是線程安全的,但Vector是線程安全的。但是,如果您以線程安全或線程中立的方式在線程中使用ArrayList,則無關緊要。例如,您可以在Web服務的JavaEE容器中使用ArrayLists,而不會有任何問題,因爲每個Web服務調用都將在其自己的線程中,而且他們正確的思路中沒有人會讓Web服務處理線程彼此進行通信。實際上,如果可以避免使用它們是因爲它們在大多數方法上都是同步的,這意味着容器的線程將阻塞,直到完成任何操作爲止,JavaEE容器中的向量非常不好。

正如AlexR所說,你可以同步事物,但最好的方法是真正地查看你的代碼,並確定這些線程是否真的要共享數據和狀態,或者正在進行自己的事情。

+0

向量不是線程安全的!您不能在一個線程中迭代並在其他線程中更新它! – 2012-02-16 11:51:53

+0

我認爲你可以說他們是線程安全的。在這種情況下會引發ConcurrentModificationException。這不像有一個不需要的(隱藏的)副作用。 Vector類通過使所有方法同步來確保訪問和內存可見性。 – 2012-02-16 12:51:48

1

'供應商告訴我,只有一個線程存在多個組件實例(工廠模式來創建組件實例),並且每個實例都可以從它的API中獨立控制。

這並不完全清楚。我認爲它的意思是:

1)創建組件不是線程安全的。也許它們全部存儲在非線程安全的容器中。據推測,組件的銷燬也不是線程安全的。

2)創建完成後,組件是「可獨立控制的」 - 這強烈表明它們是線程安全的。

到目前爲止,這是我的承擔。也許你的供應商可以確認它,只是可以肯定的是,在你繼續進行設計之前。