Vector与Hashtable都是通过锁实现同步同步容器,具体实现就是给方法加synchronized,虽然保证了多线程安全,但高并发下效率低下,而且复合操作仍然可能出现异常。
比如在遍历集合的过程中多线程访问集合元素就会出现异常。如果要保证这种操作的安全,就必须额外加锁去控制。把所有对容器的访问都加锁能实现容器的串行化访问,保证了线程安全,但严重降低容器的并发性,在多线程竞争容器的锁时就会严重影响程序的性能。
后续出现的并发容器比如ConcurrentHashMap,CopyOnWriteArrayList来代替原来的同步容器。并发容器还直接提供了一些复合操作,如putIfAbsent。
ConcurrentHashMap与hashtable的数据结构和实现上的差异:
ConcurrentHashMap 底层跟 HashMap1.8 的结构一样,数组+链表/红黑二叉树。Hashtable底层数据结构是数组+链表。
ConcurrentHashMap用分段锁,多线程访问容器里不同数据段的数据,就不会存在锁竞争,提高并发访问率。Hashtable全表锁。



