synchronized工作原理总结

锁升级


锁升级是发生在运行时期机制,当没有进行线程任务时最开始状态是无锁状态,当线程执行任务时变成偏向锁,此时偏向锁并没有真正的加锁而是对该做个标记,当有其他线程竞争时标记检测到,此时第一个线程立即将锁装换成轻量级锁并且拿到锁,当竞争激烈时,转换成重量级锁。

锁消除

非必要不加锁,发生在编译时期做的优化手段,检测当前代码是否是多线程执行/是否有必要加锁,若没必要则自动将锁去掉。

锁粗化

锁粗化:指的是锁的粒度,synchronized代码块,包含代码多少,代码越多,粒度越粗,代码越少粒度越小(串行代码少,并发执行代码多),但是如果某个场景要频繁加锁解锁,就将他转换成一个更粗粒度的锁。

HashTable和ConcurrentHashMap的区别

  • HashTable和ConcurrentHashMap都是线程安全的
  • 加锁粒度不同,HashTable针对整个哈希表加锁,任何的增删查改都要加锁,也都可能发生锁竞争,而ConcurrentHashMap是针对哈希表中每个链表进行加锁,此时就导致加锁操作发生锁冲突概率变小。
  • ConcurrentHashMap更充分的利用了CAS机制,比如更新元素个数就可以直接使用CAS完成,不必加锁。
  • 对于HashTable进行扩容时是一次性进行搬运元素,当有很多数据时,进行put发生扩容会非常卡顿,而ConcurrentHashMap并不会把所有元素进行一次性搬运,而是每次操作过程中进行搬运(增删查,删除元素看元素在哪删除那个表,查找,新表旧表都查)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值