hashmap、concurrenthashmap、CopyOnWriteArrayList底层实现和区别

一、HashMap底层实现

这部分有一篇很好的博客,推荐给大家:
http://blog.csdn.net/ghsau/article/details/16843543
博客作者强烈推荐大家看博客的同时浏览源码,在这里也建议大家看博客、浏览源码外加看帮助文档。
帮助文档:https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html

二、ConcurrentHashMap底层实现

与HashMap一样,ConcurrentHashMap也是一个基于散列的Map,但是它使用了一种完全不同的加锁策略来提供更高的并发性和伸缩性。ConcurrentHashMap并不是将每个方法都在同一个锁上同步并使得每次只能有一个线程访问容器,而是使用了一种更细粒度的加锁机制来实现更大程度的共享,这种机制成为分段锁(Lock Striping)。在这种机制中,任意数量的读取线程可以并发的访问Map,执行读取操作的线程和执行写入操作的线程可以并发的访问Map,并且一定数量的写入线程可以并发的修改Map。ConcurrentHashMap带来的结果是,在并发访问环境下将实现更高的吞吐量,而在单线程环境中只损失非常小的性能。
ConcurrentHashMap与其他并发容器类一起增强了同步容器类:它们提供的迭代器不会抛出ConcurrentModificationException,因此不需要在迭代过程中对容器加锁。ConcurrentHashMap返回的迭代器具有弱一致性,而并非“及时失败”。弱一致性的迭代器可以容忍并发的修改,当创建迭代器时会遍历已有的元素,并可以(但不保证)在迭代器被构造后将修改操作反映给容器。
ConcurrentHashMap的size和isEmpty等方法的语义被略微弱化以反映容器的并发特性。由于size返回结果在计算时可能已经过期,它实际上是一个估计值,因此允许size返回一个近似而非精确值。
应用:大多数情况下,用ConcurrentHashMap来代替同步Map能进一步提高代码的可伸缩性。只有当应用程序需要加锁Map以进行独占访问时,才应该放弃使用ConcurrentHashMap。

两者的区别

这是我重点想说的。

  • 先看一下两者在源码中的声明吧
/*HashMap.class*/
public class HashMap<K,V> extends AbstractMap<K,V>
    implements Map<K,V>, Cloneable, Serializable{

}

/*ConcurrentHashMap.class*/
public class ConcurrentHashMap<K,V> extends AbstractMap<K,V>
    implements ConcurrentMap<K,V>, Serializable {

}

从源码中可以看出,两者都继承了AbstractMap < K,V >;并且分别实现了相应接口。

  • 是否可null:HashMap的K和V的值都可以为null;ConcurrentHashMap的K和V的值均不能为null。
  • 并发性:ConcurrentHashMap支持多线程并发检索或更新,是线程安全的。而HashMap不具备这些特性。

三、CopyOnWriteArrayList底层实现

CopyOnWriteArrayList是用来代替同步List,如Vector。在某些情况下提供了更好的并发性能,并且在迭代期间不需要对容器进行加锁或复制。(类似的,CopyOnWriteSet的作用是替代同步Set)

“写入时复制(Copy-On-Write)”容器的线程安全性在于,只要正确的发布一个事实不可变的对象,那么访问该对象时就不再需要进一步的同步。在每次修改时,都会创建并发布一个新的容器副本,从而实现可变性。“写入时复制”容器的迭代器保留一个指向底层基础数组的引用,这个数组当前位于迭代器的起始位置,由于它不会被修改,因此在对其进行同步时只需要确保数组内容的可见性。因此,多线程可以同时对这个容器进行迭代,而不会彼此干扰或者与修改容器的线程相互干扰。

应用场景:仅当迭代操作远远多于修改操作时,才应该使用“写入时复制”容器。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值