如何避免需要了解記憶體模型

記憶模型很難理解,也很難應用。如果你需要推斷多執行緒程式碼的正確性,這很有用,但你不希望為你編寫的每個多執行緒應用程式執行此推理。

如果在 Java 中編寫併發程式碼時採用以下原則,則可以在很大程度上避免推理之前求助於發生

  • 儘可能使用不可變資料結構。正確實現的不可變類將是執行緒安全的,並且在與其他類一起使用時不會引入執行緒安全問題。

  • 理解並避免不安全的出版物

  • 使用原始互斥鎖或 Lock 物件來同步對需要執行緒安全的可變物件的狀態訪問 1

  • 使用 Executor / ExecutorService 或 fork join 框架而不是嘗試直接建立管理執行緒。

  • 使用提供高階鎖,訊號量,鎖存器和障礙的`java.util.concurrent 類,而不是直接使用 wait / notify / notifyAll。

  • 使用 java.util.concurrent 版本的地圖,集,列表,佇列和 deques,而不是非併發集合的外部同步。

一般原則是嘗試使用 Java 的內建併發庫,而不是滾動自己的併發。如果正確使用它們,你可以依賴它們。

1 - 並非所有物件都需要執行緒安全。例如,如果一個或多個物件是執行緒限制的 (即它只能被一個執行緒訪問),那麼它的執行緒安全性就不相關了。