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

本文标签: 线程对象监视器机制