背景
HashMap不是线程安全的。当我们说一个类不是线程安全的,准确意思是说:在多个线程都会访问到这个类的情况下,如果不做特殊处理(比如线程同步等),这个类的数据会被不正确的修改(修改出脏数据)或不正确的读取(读取不到最新值)。
HashMap中有成员变量Node<K,V> table,但是其put、remove等操作均没有任何加锁操作,这必然无法保证线程安全。
而HashTable、Collections.SynchronizedMap虽然都是线程安全的,但是实现线程安全的方式有些简单粗暴,要么就是将方法变为synchronied方法,要么就是在方法里面加synchronized同步块,这样的做法是虽然通过线程同步保证了数据安全,但是有些粗暴,一刀切。简而言之就是,不管你是来访问哈希表里面什么位置的数据的,通通以该哈希表为锁,一个一个地来。