Reentrantlock 简介及其使用场景

1、Reentrantlock 是并发包中一个可重入的锁,是基于AQS(AbstractQueuedSynchronized)实现的,它有公平锁和不公平锁两种实现方式。

2、Reentranlock 中有一个内部抽象类 Sync 继承自 AbstractQueuedSynchronized ,主要是它来实现锁的功能, Sync 在 ReentrantLock 中有两种实现类:NonfairSync、FairSync,正好对应了ReentrantLock的非公平锁、公平锁两大类型。Reentranlock 默认实现为非公平锁,在高竞争的条件下有更好的性能。

ReentrantLock的使用场景:

1、发现该操作已经在执行中则不再执行

用在定时任务时,如果任务执行时间可能超过下次计划执行时间,确保该任务只有一个正在执行,忽略重复触发。

2、如果该操作已经在执行,则等待一个个执行(同步执行,与synchronized类似)。

3、如果该操作已经在执行,则尝试等待一段时间,超时则放弃执行
这种其实属于场景2的改进,等待获得锁的操作有一个时间的限制,如果超时则放弃执行,用来防止由于资源处理不当长时间占用导致死锁情况。

场景4:如果发现该操作已经在执行,等待执行,这时可中断正在进行的操作立刻释放锁继续下一操作。
synchronized 与 Lock 在默认情况下是不会响应中断(interrupt)操作,会继续执行完。Reentranlock中的 lockInterruptibly() 方法提供了可中断锁来解决此问题。(场景2的另一种改进,没有超时,只能等待中断或执行完毕)。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中的Lock是一种更高级别的线程同步机制,它比传统的synchronized关键字更加灵活,性能也更好。Java中的Lock要求显式地获取锁和释放锁,而synchronized则会自动获取和释放锁。下面介绍一下Lock的使用及其常见的使用场景。 ### Lock的使用 Java中的Lock接口定义了一组方法,用于获取锁、释放锁以及其他一些与锁相关的操作。Lock的常用实现类有ReentrantLock、ReentrantReadWriteLock.ReadLock和ReentrantReadWriteLock.WriteLock等。 下面是一个简单的使用ReentrantLock的示例: ```java import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class LockDemo { private Lock lock = new ReentrantLock(); public void method() { lock.lock(); // 获取锁 try { // 这里是需要同步的代码块 } finally { lock.unlock(); // 释放锁 } } } ``` 在上面的示例中,我们使用ReentrantLock来实现锁的功能。在需要同步的代码块前调用lock()方法获取锁,在同步代码块执行完后调用unlock()方法释放锁。 ### Lock的使用场景 Lock的使用场景与synchronized类似,都是在多线程环境下对共享资源进行同步。但是,由于Lock的灵活性更强,所以它的使用场景比synchronized更加广泛。 下面是一些常见的Lock的使用场景: - 高并发情况下的线程同步:在高并发情况下,使用Lock可以提供更好的性能,因为它的实现比synchronized更加高效。 - 读写分离的情况下的线程同步:在读写分离的情况下,使用ReentrantReadWriteLock可以实现读写锁,使得读操作可以并发执行,而写操作需要独占锁,保证数据的一致性。 - 死锁避免:在使用synchronized时,如果由于某些原因没有及时释放锁,就可能导致死锁。而使用Lock时,可以在获取锁的时候设置超时时间,避免死锁的发生。 总之,Lock是Java中一种强大的线程同步机制,使用时需要注意锁的获取和释放,以及异常处理等问题,但它的灵活性和性能优势使得它成为Java并发编程中不可或缺的一部分。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值