- 编写线程安全的并发代码,主要在于要对共享的可变状态访问操作进行管理。因为共享状态可被多条线程同时访问导致线程安全问题,可以通过同步手段,或者干脆状态不共享、不可变,就不会出现线程安全的问题。
- 从使用同步手段角度考虑,有时不恰当的执行时序导致不正确的结果,可以通过锁和volatile来确保该变量的操作不被重排序(在没有同步的情况下,编译器、处理器以及运行时等都可能对操作的执行顺序进行一些意想不到的调整),比如递增变量出现的线程不安全,使用Atomic类将复合操作变为原子操作可以解决。
- 从状态不共享角度考虑,对象逸出(没有安全的发布对象,就是某个不应该发布的对象被发布)导致的线程安全问题,可以通过控制方法域,或者线程封闭的方式解决。
- 从状态不可变角度考虑,将对象域设置为final类型,此对象就是不可变的,然后通过volatile类型来发布不可变对象,可以达到线程安全的目的。
- Java平台类库包含了丰富的并发基础构建模块,例如线程安全的容器类以及各种用于协调多个相互协作的线程控制流的同步工具类(Synchronizer)。ConcurrentHashMap、CopyOnWriteArrayList分别用于代替同步状态下的Map和List。
参考: