admin管理员组文章数量:1530845
2024年4月6日发(作者:)
synchronized和reentrantlock原理
在Java中,多线程操作的同步机制是非常重要的,
synchronized和ReentrantLock就是两种最常用的同步实现方式。本
文将分步骤阐述这两种机制的原理。
一、synchronized原理
1. 同步块
synchronized关键字可以作用于方法或代码块中。当它作用于代
码块时,需要使用对象监视器来进行同步。在Java中,每一个对象都
会有一个对象监视器,利用该对象监视器,可以实现同步块。
2. 对象监视器
当一个线程进入到synchronized代码块时,它需要等待获取对
象的对象监视器。如果当前这个对象的对象监视器已经被另一个线程
占用了,那么当前的线程将被阻塞,直到该对象的对象监视器被释放。
3. 实现原理
当一个线程进入到synchronized代码块后,会尝试获取对象监
视器。如果对象监视器已经被占用了,那么这个线程就会进入到阻塞
状态,等待其他线程释放对象监视器。
二、ReentrantLock原理
ReentrantLock与synchronized相似,也是一种同步机制,但是
它比synchronized更加灵活,可以提供更多高级特性。
1. 非公平锁和公平锁
ReentrantLock可以设置锁为公平锁或非公平锁,如果锁被设置
为公平锁,则线程可以按照先进先出的顺序获得该锁,如果设置为非
公平锁,则线程可以插队获得该锁。
2. 重进入锁
ReentrantLock这个名字的由来,就是因为它支持重进入锁。也
就是说,一个线程可以重复获得已经获得的锁,而synchronized则不
支持这个特性。
3. 实现原理
ReentrantLock的实现依赖于
AQS(AbstractQueuedSynchronizer)。
AQS维护了一个FIFO队列,等待获取锁的线程都会被加入到这个
队列中。当一个线程获得锁时,AQS会将这个线程放到持有锁的队列中,
并将锁的状态设为已经被占用。当这个线程释放锁时,AQS会将持有锁
的队列的头结点出队列,并唤醒下一个线程。
总结:两种同步机制都可以实现线程安全,但是
更加灵活,可以提供更多的高级特性。
ReentrantLock
版权声明:本文标题:synchronized和reentrantlock原理 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dongtai/1712356194a356284.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论