简述
- 封装共享变量、识别共享变量间的约束条件、制定并发访问策略。
封装共享变量
- 将共享变量(属性和方法)作为对象属性封装在内部,对所有公共方法制定并发访问策略,也就是说外界对象只能通过目标对象提供的公共方法来间接访问这些内部属性。
- 例如银行卡卡号、姓名、身份证。对于这些不会发生变化的共享变量,可以用 final 修饰。
识别共享变量间的约束条件
- 在设计阶段,一定要识别出所有共享变量之间的约束条件,如果识别不足,很可能导致制定的并发访问策略南辕北辙。
- 共享变量之间的约束条件,反映在代码里,基本上都会有 if 语句,所以一定要特别注意竞态条件。
制定并发访问策略
- 避免共享:避免共享的技术主要是利于线程本地存储以及为每个任务分配独立的线程。
- 不变模式:这个在 Java 领域应用的很少,但在其他领域却有着广泛的应用,例如 Actor 模式、CSP 模式以及函数式编程的基础都是不变模式。
- 管程及其他同步工具:Java 领域万能的解决方案是管程,但是对于很多特定场景,使用 Java 并发包提供的读写锁、并发容器等同步工具会更好。
有助于你写出“健壮”的并发程序的宏观原则
- 优先使用成熟的工具类:Java SDK 并发包里提供了丰富的工具类,基本上能满足你日常的需要,而不是要自己再“发明轮子”,毕竟并发工具类不是随随便便就能发明成功的。
- 迫不得已时才使用低级的同步原语:低级的同步原语主要指的是 synchronized、Lock、Semaphore 等,这些虽然感觉简单,但实际上并没那么简单,一定要小心使用。
- 避免过早优化:安全第一,并发程序首先要保证安全,出现性能瓶颈后再优化。在设计期和开发期,很多人经常会情不自禁地预估性能的瓶颈,并对此实施优化,但残酷的现实却是:性能瓶颈不是你想预估就能预估的。