Synchronized VS ReentrantLock

Synchronized VS ReentrantLock 区别

相同点:

  • 都是可重入锁;

不同点:

  1. ReentrantLock 需要手动解锁,Synchronized 不需要;
  2. ReentrantLock 支持设置超时时间(可以避免死锁,比较灵活),支持公平锁和非公平锁,可中断,支持条件判断;Synchronized 不支持超时时间,仅支持非公平锁,不可中断,不支持条件;

总结:

一般情况下用 Synchronized 足矣,比较简单,复杂情况用 ReentrantLock ,比较灵活,支持的功能比较多。

性能问题:随着 JDK 版本的改进,Synchronized 的性能越来越好,Synchronized 性能不如 ReentrantLock 已经是N年前的事情了。

Synchronized

开始前的两个问题

  1. 轻量级锁是否会进行自旋操作?
    答:
    在 jdk1.8 的源码中,轻量级锁通过 CAS 获取锁失败后,是直接膨胀成重量级锁。重量级锁会进行自旋。

轻量级锁没有自旋操作。
2. 何时进行自旋操作?
在升级为 重量级锁之后,线程如果没有抢到锁,会进行一段自旋操作,等待锁的释放。自旋失败就入队,并且阻塞线程。

spin 旋转

源码中,TrySpin_VaryDuration 表示自适应自旋

mutex 互斥

pthread mutex 互斥锁(linux 下常见的实现)
mutex lock 互斥锁
mutex semaphores 互斥信号量

invariant 不变量
variant 变量

recursion 递归
recurse 递归

idea 有一个 jclasslib 插件,查看生产的字节码功能较全。

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2022-2023 ligongzhao
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信