欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

Concurrent包下的常用并发类和普通类之间的区别

发布时间:2025/3/19 52 豆豆
生活随笔 收集整理的这篇文章主要介绍了 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包下的常用并发类和普通类之间的区别的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。