如何避免需要了解内存模型

记忆模型很难理解,也很难应用。如果你需要推断多线程代码的正确性,这很有用,但你不希望为你编写的每个多线程应用程序执行此推理。

如果在 Java 中编写并发代码时采用以下原则,则可以在很大程度上避免推理之前求助于发生

  • 尽可能使用不可变数据结构。正确实现的不可变类将是线程安全的,并且在与其他类一起使用时不会引入线程安全问题。

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

  • 使用原始互斥锁或 Lock 对象来同步对需要线程安全的可变对象的状态访问 1

  • 使用 Executor / ExecutorService 或 fork join 框架而不是尝试直接创建管理线程。

  • 使用提供高级锁,信号量,锁存器和障碍的`java.util.concurrent 类,而不是直接使用 wait / notify / notifyAll。

  • 使用 java.util.concurrent 版本的地图,集,列表,队列和 deques,而不是非并发集合的外部同步。

一般原则是尝试使用 Java 的内置并发库,而不是滚动自己的并发。如果正确使用它们,你可以依赖它们。

1 - 并非所有对象都需要线程安全。例如,如果一个或多个对象是线程限制的 (即它只能被一个线程访问),那么它的线程安全性就不相关了。