synchronized和ReentrantLock的实现原理是什么?它们又什么区别?

Crazy Code Farmer 2020-10-14 05:09:59

多线程面试中高频考点,我们发表不同的见解,增强印象。
...全文
4418 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
shuster 2020-10-16
  • 打赏
  • 举报
回复
synchronized是java自带的关键字,使用起来非常方便,ReentrantLock是jdk中提供的一个类。java开始支持synchronized时其效率相比ReentrantLock比较低,后面经过逐步优化,效率才和ReentrantLock相当。ReentrantLock的实现可以参考jdk的源码,继承了AbstractQueueSychronizer ,并且使用unsafe类的park和unpark休眠和唤醒线程,通过compareAndSwap方法实现并发机制,即获取锁实际上就是去改变内存中的某个变量的值,改变成功了代表获取了锁,如果该变量已经被其他线程修改了,当前线程只能等待其他线程修改回来,当前线程要么循环去判断要么休眠。java中对象有MarkWord,synchronized实现和其有关,synchronized有enter队列和wait队列,获取锁进入enter队列进行竞争,已经获取锁的通过wait方法释放锁后会进入wait队列,通过notify方法唤醒后会重新进入enter队列竞争锁。 ps:关于如何保证并发安全性的底层实现Linux 0.11中是通过禁用中断实现的,很简单粗暴。现在有原子指令来保证,通过锁内存来实现,软件上很难实现的东西硬件上很容易实现。以上内容经供参考,一些细节记不清了,需要去找资料研究!!!
做一个海贼 2020-10-15
  • 打赏
  • 举报
回复
都是可重入锁,synchronized使用完之后锁会自动释放,ReentrantLock需要手动释放,ReentrantLock更灵活点可以设置超时时间之类的。synchronized相对更简单使用方便。其他方面应该都差不多

62,634

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧