目录
1.ConcurrentHashMap的读会否需要加锁,为什么?
3.ConcurrentHashMap在jdk1.8做了哪些优化?
4.HashTable和HashMap、ConcurrentHashMap之间的区别?

前言
在前面我们学习了一些在中java集合类,例如ArrayList、Queue、HashMap、StringBuilder等一些常见的集合类,但这些都是线程不安全的类,不能在多线程中使用。考虑多线程的情况下,我需要使用一些线程安全的类,Vector、Stack、HashTable是线程安全的类,但并不建议使用。
在多线程的情况下,建议自己加锁,或者使用一些带锁的数据结构。
多线程环境使用ArrayList
ArrayList本身是一个线程不安全的集合类,在多线程的情况下,对于其读和写操作,存在着线程安全问题,因此,提出了下面几种解决方法:
- 自己使用同步机制(synchronized或者ReentrantLock)。
- Collection.synchronizedList(new ArrayList);其实就是在相关方法面前进行synchronized的加锁。
synchronizedList 是标准库提供的⼀个基于synchronized进⾏线程同步的List.synchronizedList 的关键操作上都带有synchronized
3.CopyOnWriteArrayList:即写时复刻的容器。
在进行读操作时,容器不用做任何改变。当我们往容器里添加元素的时候,不会直接往当前容器里添加,而是会先对当前容器Copy复制出一个新的容器,往后往新的容器里添加元素。当添加完元素之后,再将原容器的引用指向新的容器。
我们可以查看CopyOnWriteArrayList中的add方法,我们可以看到和我们上面说的一致。

当我们想要进行写操作,会先进行拷贝,再在拷贝的数组里存放数据。
CopyOnWriteArrayList容器的优缺点:
优点:
- 读操作无需加锁:由于使用了写时拷贝策略,在读取操作的时候,可以在没有锁的情况下进行,提高了读取操作的性能。在读多写少的场景下,不需要加锁竞争。

最低0.47元/天 解锁文章
279

被折叠的 条评论
为什么被折叠?



