如何避免需要了解記憶體模型
記憶模型很難理解,也很難應用。如果你需要推斷多執行緒程式碼的正確性,這很有用,但你不希望為你編寫的每個多執行緒應用程式執行此推理。
如果在 Java 中編寫併發程式碼時採用以下原則,則可以在很大程度上避免在推理之前求助於發生。
-
儘可能使用不可變資料結構。正確實現的不可變類將是執行緒安全的,並且在與其他類一起使用時不會引入執行緒安全問題。
-
理解並避免不安全的出版物。
-
使用原始互斥鎖或
Lock
物件來同步對需要執行緒安全的可變物件的狀態訪問 1 。 -
使用
Executor
/ExecutorService
或 fork join 框架而不是嘗試直接建立管理執行緒。 -
使用提供高階鎖,訊號量,鎖存器和障礙的`java.util.concurrent 類,而不是直接使用 wait / notify / notifyAll。
-
使用
java.util.concurrent
版本的地圖,集,列表,佇列和 deques,而不是非併發集合的外部同步。
一般原則是嘗試使用 Java 的內建併發庫,而不是滾動自己的併發。如果正確使用它們,你可以依賴它們。
1 - 並非所有物件都需要執行緒安全。例如,如果一個或多個物件是執行緒限制的 (即它只能被一個執行緒訪問),那麼它的執行緒安全性就不相關了。