如何避免需要了解内存模型
记忆模型很难理解,也很难应用。如果你需要推断多线程代码的正确性,这很有用,但你不希望为你编写的每个多线程应用程序执行此推理。
如果在 Java 中编写并发代码时采用以下原则,则可以在很大程度上避免在推理之前求助于发生。
-
尽可能使用不可变数据结构。正确实现的不可变类将是线程安全的,并且在与其他类一起使用时不会引入线程安全问题。
-
理解并避免不安全的出版物。
-
使用原始互斥锁或
Lock
对象来同步对需要线程安全的可变对象的状态访问 1 。 -
使用
Executor
/ExecutorService
或 fork join 框架而不是尝试直接创建管理线程。 -
使用提供高级锁,信号量,锁存器和障碍的`java.util.concurrent 类,而不是直接使用 wait / notify / notifyAll。
-
使用
java.util.concurrent
版本的地图,集,列表,队列和 deques,而不是非并发集合的外部同步。
一般原则是尝试使用 Java 的内置并发库,而不是滚动自己的并发。如果正确使用它们,你可以依赖它们。
1 - 并非所有对象都需要线程安全。例如,如果一个或多个对象是线程限制的 (即它只能被一个线程访问),那么它的线程安全性就不相关了。