Files
Hui-s-notebook/Java 并发编程实战.md
2023-09-10 10:50:53 +08:00

1.9 KiB
Raw Blame History

ArrayBlockingQueue 的使用

异步日志打印

Tomcat 的 NioEndPoint 中 ConcurrentLinkedQueue 的使用

并发组件 ConcurrentHashMap 使用注意事项

putK key, V value方法判断如果 key 已经存在,则使用 value 覆盖原来的值并返回原来的值,如果不存在则把 value 放入并返回 null。而 putIfAbsentK key, V value方法则是如果 key 已经存在则直接返回原来对应的值并不使用 value 覆盖,如果 key 不存在则放入 value 并返回 null另外要注意判断 key 是否存在和放入是原子性操作。

SimpleDateFormat 是线程不安全的

  • 每次使用时 new 一个 SimpleDateFormat 的实例
  • 可以使用 synchronized 进行同步
  • 使用 ThreadLocal这样每个线程只需要使用一个 SimpleDateFormat 实例

使用 Timer 时需要注意的事情

当一个 Timer 运行多个 TimerTask 时,只要其中一个 TimerTask 执行中向 run 方法外抛出了异常,其他任务也会自动终止

对需要符合但是会被下游修改的参数要进行深复制

引用类型作为集合元素时,如果使用这个集合作为另外一个集合的构造函数参数,会导致两个集合里面的同一个位置的元素指向的是同一个引用,这会导致对引用的修改在两个集合中都可见,所以这时候需要对引用元素进行深复制

创建线程和线程池时要指定与业务相关的名称

出现问题时方便定位

使用线程池的情况下程序结束时记得调用 shutdown 关闭线程池

使用完后不调用 shutdown 关闭线程池,会导致线程池资源一直不释放

线程池使用 FutureTask 时需要注意的事情

如果把拒绝策略设置为 DiscardPolicy 和 DiscardOldestPolicy并且被拒绝任务的 Future 对象上调用了无参 get 方法,调用线程会一直被阻塞

使用 ThreadLocal 不当可能导致内存泄漏

使用完 ThreadLocal 变量后,要记得及时清除掉