java常用的三种HashMap(HashMap, HashTable, CocurrentHashMap)

本文风格:实用+简单解释,一般来讲,没必要花太多时间去看解释
1.HashMap
在并发编程过程中使用可能导致死循环,因为插入过程不是原子操作;
不必要的解释:
[
每个HashEntry是一个链表节点,很可能在插入的过程中,已经设置了后节点,实际还未插入,最终反而插入在后节点之后,造成链中出现环,破坏了链表的性质,失去了尾节点,出现死循环。
]
2.HashTable
线程安全,
线程安全的原由:内部采用synchronized
缺点:在线程竞争激烈的情况下HashTable的效率下降得很快。
不必要的解释:
[
效率低下的原因:因为syncronized关键字会造成代码块或者方法成为临界区(对同一个对象加互斥锁),当一个线程访问临界区的代码时,其他线程也访问同一临界区时,会进入阻塞或者轮询状态。(因为锁只有一个,但获取锁意向的线程数目却很多,所以会阻塞)。
]

3.CocurrentHashMap
利用锁分段技术增加了锁的数目,从而使争夺同一把锁的线程的数目得到控制。
采用volatile关键字
不必要的解释:
[
锁分段技术,就是对数据集进行分段,每段竞争一把锁,不同数据段的数据不存在锁竞争,从而有效提高 高并发访问效率;
CocurrentHashMap的get方法是无需加锁的,因为用到的共享变量是采用volatile关键字修饰,保证了共享变量在线程之间的可见性(每次读取都先同步缓存和内存,直接从内存中获取值,虽然不是原子操作,但是根据java内存模型的happen before原则,对volatile的写入操作先于读操作,能够保证不会脏读),volatile为了让变量提供线程之间的内存可见性,会禁止程序执行结果的重排序(导致缓存优化的效果降低)
关于volatile关键字的详解,请参见(https://blog.csdn.net/weixin_38343070/article/details/84568420)
]
By the way:
synchronized与volatile的取舍:
1.synchronized实现了原子性操作,不同的线程互斥的进入临界代码区,而且是内存可见的,所谓的内存可见,也就是每个线程进入临界区时,都是从内存中获取的值,不会因为缓存而出现脏读。
2.volatile实现了内存可见性,会将修改的值直接写入内容,并且注销掉之前对于该变量的缓存,而且禁止了指令的排序,但是它不是原子操作。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值