第 78 条:同步访问共享的可变数据
第 79 条:避免过度同步
第 80 条:executor 和 task 优先于线程
- Executor.newCachedThreadPool:小程序,轻载的服务器
- Executor.newFixedThreadPool:大负载的服务器
- ThreadPoolExecutor:最大限度的控制
- ScheduledThreadPoolExecutor:代替 java.util.Timer
第 81 条:并发工具优先于 wait 和 notify
java.util.concurrent 中更高级的工具分三类:Executor Framework,并发集合(Concurrent Collection)以及同步器(Synchronizer)。
优先使用 ConcurrentHashMap,而不是 Collections.synchronizedMap 或者 Hashtable
最常用的同步器是 CountDownLatch 和 Semaphore,不常用的是 Barrier 和 Exchanger。
对于间歇式定时,应该始终使用 System.nanoTime 而不是 System.cucurrentTimeMills。
第 82 条:线程安全性的文档化
一个类为了可被多个线程安全使用,必须在文档中清楚地说明它所支持的线程安全性级别。
第 83 条:慎用延迟初始化
对于延迟初始化,最好建议“除非绝对必要,否则就不要那么做”。延迟化降低了初始化类或者创建实例的开销,却增加了访问被延迟初始化的域的开销。
如果域只是在类的实例部分被访问,并且初始化这个域的开销很高,可能就值得进行延迟初始化。
- 静态域:lazy initialization holder class 模式。
- 实例域:双重检查模式。
第 84 条:不要依赖于线程调度器
不要让应用程序的并发性依赖于线程调度器
不要依赖 Thread.yield 和线程优先级