HashMap 在单线程程序中经常使用到,而且都知道HashMap是线程不安全的,HashTable是线程安全。
引用百度定义线程安全和线程不安全
“线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。 线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据。”
说白了无非就是加锁机制,1.5之前加锁一般都会使用synchronized.加锁必然损失一定的性能。
但是这里需要对比一下,后面的几个,java为啥会多出这么多的东西,还都差不多。
Hashtable 使用的锁是对整个hashtable进行加锁,当一个线程访问的时候,另一个必须等待。效率确实很慢
ConcurrentHashMap 是对 Hashtable的改进,加入了桶的概念,默认为16个桶,将全局锁缩小为桶锁,因此,同时执行的并发线程扩大到了16倍,执行速度加快。
另外,据说ConcurrentHashMap使用到了不同于传统集合的快速失败迭代器的另一种迭代方式,fast-fail(使用增强for循环遍历list集合,list会抛出异常ConcurrentModificationEx
Collections.synchronizedMap 效果等同于HashTable,但是此方法可以给TreeMap进行加锁,加锁的粒度范围比较广