美文网首页
ReentrantLock和synchronized区别

ReentrantLock和synchronized区别

作者: LZhan | 来源:发表于2019-12-30 13:30 被阅读0次

转自 公众号 【彤哥说源码】

1 简介

synchronized是Java原生提供的用于多线程环境中保证同步的关键字,底层通过修改对象头中的MarkWord来实现。
ReentrantLock是Java语言层面提供的用于在多线程环境中保证同步的类,底层是通过原子更新状态变量state来实现的。

2 异同

功能 ReentrantLock synchronized
可重入 支持 支持
非公平 支持(默认) 支持
加锁/解锁方式 需要手动加锁、解锁,一般使用try...finally保证锁能释放 手动加锁,无需刻意加锁
按key加锁 不支持,比如按用户id加锁 支持,synchronized加锁时需要传入一个对象
公平锁 支持,new ReentrantLock(true) 不支持
中断 支持,lockInterruptibly() 不支持
尝试加锁 支持,tryLock() 不支持
超时锁 tryLock(timeout,unit) 不支持
获取当前线程获取锁的次数 支持,getHoldCount() 不支持
获取等待的线程 支持,getWaitingThreads() 不支持
检测是否被当前线程占有 支持,isHeldByCurrentThread() 不支持
检测是否被任意线程占有 支持,isLocked() 不支持
条件锁 可支持多个条件,condition.await(),condition.signal(),condition.signalAll() 只支持一个,obj.wait(),obj.notify(),obj.notifyAll()

3 注意

synchronized是Java原生支持的,随着Java版本的不断升级,Java团队也是在不断优化synchronized,所以我认为在功能相同的前提下,最好还是使用原生的synchronized关键字来加锁,这样我们就能获得Java版本升级带来的免费的性能提升的空间。

相关文章

网友评论

      本文标题:ReentrantLock和synchronized区别

      本文链接:https://www.haomeiwen.com/subject/rhtmoctx.html