为什么Vector、HasTable是线程安全的?

Vector源码类

add方法:

为什么Vector、HasTable是线程安全的?

get方法:

为什么Vector、HasTable是线程安全的?

 

HashTable源码类

put方法:

为什么Vector、HasTable是线程安全的?

get方法:

为什么Vector、HasTable是线程安全的?

他们都有一个共同点都加了同步函数,来保证线程安全

因为HashTable的读写都是同步的,所以多线程效率非常低,jdk1.5后出现了他的替代品

ConcurrentHashMap

ConcurrentMap接口下有俩个重要的实现 :
ConcurrentHashMap
ConcurrentskipListMap (支持并发排序功能。弥补ConcurrentHashMap)
ConcurrentHashMap内部使用段(Segment)来表示这些不同的部分,每个段其实就是一个小的HashTable,它们有自己的锁(分段锁)。只要多个修改操作发生在不同的段上,它们就可以并发进行。把一个整体分成了16个段(Segment.也就是最高支持16个线程的并发修改操作。这也是在重线程场景时减小锁的粒度从而降低锁竞争的一种方案。

并且代码中大多共享变量使用volatile关键字声明,目的是第一时间获取修改的内容,性能非常好,并且可以解决重排序问题。

为什么Vector、HasTable是线程安全的?