Concurrent包下的常用并发类和普通类之间的区别
1. ConcurrentHashMap和HashMap以及Hashtable之间的区别
1.1 HashMap不是线程安全的,key和value都可为null;而Hashtable是线程安全的,代码中要求value不为null,但是在计算key的hashcode是直接调用,所以key也不能为null。
1.2 但Hashtable是锁住整个hash表,而ConcurrentHashMap是将hash表分为多个segment,每次操作先将映射到相应的segment,因为segment继承了ReentrantLock,所以segment操作可以保证线程安全,这样锁的粒度变细,并发性能提升明显。key和value都不能为null,因为value为null无法判断数据不存在还是数据存在但为null,存在歧义;而对于HashMap在get(key)获得null时,可以在不并发的情况调用contains(key)来解决歧义。
2. ConcurrenLinkedQueue和LinkedBlockingQueue之间的区别
2.1 ConcuLinkedQueue是非阻塞队列,采用CAS+自旋保证并发的数据安全。对于写操作较多的场景,会增加自旋的次数;但是对于多个读操作,并不影响性能。
2.2 LinkedBlockingQueue是阻塞队列,通过锁机制保证数据安全。如果队列为空,那么消费者线程被阻塞。所以适合生产者多于消费者的场景。
3. CopyOnWriteArrayList和ArrayList
3.1 CopyOnWriteArrayList在实现ArrayList的基础上,又实现了线程安全。但不是通过加锁来实现线程安全,因为这样性能太低;而且对于读操作是不更改数据的,所以多个读操作之间不需要加锁,只有读写、写写之间需要考虑线程安全。但是,CopyOnWriteArrayList最关键的是在读写操作并发也不阻塞读操作,只会对多个写操作之间进行加锁。如果存在写操作,那么先复制一份数据,然后更改,最终再覆盖原始的数据,这样在并发场景下可以高效地处理数据。
3.2 CopyOnWriteArrayList读取数据的源码分析——没有加锁操作
3.3 CopyOnWriteArrayList写数据的源码分析——只会进行写操作的同步
4. CopyOnWriteArraySet
4.1 内部就是CopyOnWriteArrayList
4.2 CopyOnWriteArrayList怎么满足CopyOnWriteArraySet的元素不重复性质
与50位技术专家面对面20年技术见证,附赠技术全景图总结
以上是生活随笔为你收集整理的Concurrent包下的常用并发类和普通类之间的区别的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 简单分析及总结BlockingQueue
- 下一篇: 分析对象内部结构,并详解synchron