同步访问共享的可变数据
- 关键字
synchronized
可以保证在同一时刻,只有一个线程可以执行某一个方法,或者某一个代码块 - 当多个线程共享可变数据的时候,每个读或者写数据的线程都必须执行同步
避免过度同步
executor (线程池)、task (任务Runnable、Callable)和 stream 优先于线程(Thread)
并发工具优于wait和notify
java.util.concurrent
中更高级的工具分成三类:Executor Framework 、并发集合(Concurrent Collection)以及同步器(Synchronizer)Map
的putIfAbsent(key, value)
方法- 应该优先使用
ConcurrentHashMap
,而不是使用Collections.synchronizedMap
- 同步器(Synchronizer)是使线程能够等待另一个线程的对象,允许它们协调动作。最常用的同步器是
CountDownLatch
和Semaphore
。较不常用的是CyclicBarrier
和Exchanger
。功能最强大的同步器是Phaser
。 - 对于间歇式的定时,始终应该优先使用
System.nanoTime
,而不是使用System.currentTimeMillis
。因为System.nanoTime
更准确,也更精确,它不受系统的实时时钟的调整所影响
文档应包含线程安全属性
明智谨慎的使用延迟初始化
不要依赖线程调度器
任何依赖线程调度器来保证正确性或性能的程序都可能是不可移植的。