并发

第 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 和线程优先级

Author: iMine
Link: https://imine141.github.io/2020/08/01/Effective%20java/%E5%B9%B6%E5%8F%91/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.