几种数据结构的使用场景

Map/HashMap/TreeMap/LinkedHashMap

Map是一种抽象,维护了一组<key,value>的集合,可以通过map.get(key)访问value

HashMap是Map的完整实现。

TreeMap同样是Map的实现,同时还是SortedMap接口的实现,使用场景包括有序访问Map中的元素其顺序由Key中的实现的Comparable接口实现有序

LinkHashMap同样实现了元素有序,其中有序是按照元素进入Map的顺序

以上数据结构没有对多线程做保护,需要额外的代码才能维护在多线程下的正确性

ConcurrentHashMap

是HashMap的多线程版本,能够在多线程下保证Map本身的正确性,同时通过减少锁范围提高了多线程访问的性能

使用场景

用作集中式缓存,或者配置文件映射

Atomic处理系列

AtomicLong,AtomicInteger……等

通过硬件cas(compare and swap)来完成在多线程下的原子操作

这类对象的特性是,因为采用硬件级别的处理,故效率极高,且每个操作的原子性都有保证。

但是cas天生的特性,在竞争非常激烈的时候会导致所有人都瘫痪

AtomicLong的弱化版本LongAdder(JDK1.8加入)

为了解决CAS的缺陷,我们将放弃一部分原子性

具体到LongAdder是放弃了sum的原子性,故而这个类不能适用于比如分发uuid,限流计数等必须对sum有原子性的操作

使用场景

Atomic系列完全可以当作任何基本类型需要用到的且是多线程环境下的需要保证线程安全的地方比如:计数场景,UUID分发场景,边界值控制场景

LongAdder:适用于对long的当前准确值没有需求的场景,比如说阿里双十一大屏的那些数据,这些场景下,对与数据的延迟是可容忍的