浅析ReentrantLock

本文详细介绍了Java中的ReentrantLock,包括其与synchronized的对比,重进入的实现原理,以及公平与非公平锁的区别。ReentrantLock支持手动加锁和解锁,可响应中断,并通过AQS实现重进入。非公平锁虽然可能导致线程饥饿,但其效率更高,因此成为默认实现。
摘要由CSDN通过智能技术生成

重入锁(ReentrantLock)

重入锁(ReentrantLock),就是支持重进入的锁,它表示该锁能够支持一个线程对资源的重复加锁。除此之外,该锁还支持获取锁时的公平性和非公平性选择(默认是非公平)。它是一种独占锁。

ReentrantLock与synchronized对比

(1)都是独占锁,synchronized加锁和解锁的过程自动进行。ReentrantLock加锁和解锁的过程需要手动进行

(2)都可重入,synchronized因为加锁和解锁自动进行,不必担心最后是否释放锁;ReentrantLock加锁和解锁需要手动进行,且次数需一样,否则其他线程无法获得锁

(3)synchronized不可响应中断,一个线程获取不到锁就一直等着;ReentrantLock可以响应中断。

(4)synchronized非公平锁

如果使用自定义的独占锁,重复调用lock则会导致线程阻塞(进入死锁状态)。而ReentrantLock在调用lock方法时,已经获取锁的线程能够再次调用lock取得锁而不被阻塞。

响应中断(中断锁):

如果某一线程A正在执行锁中的代码,另一线程B正在等待获取该锁,可能由于等待时间过长,线程B不想等待了,想先处理其他事情,我们可以让它中断自己或者在别的线程中中断它,这种就是可中断锁。

// 不会阻塞
public static void main(String[] args){
   
        ReentrantLock lock = new ReentrantLock();
        lock.lock();
        System.out.println("第一次上锁");
        lock.lock();
        System.out.println("第二次上锁");
        lock.unlock();
        System.out.println("释放第二个锁");
        lock.unlock();
        System.out.println("释放第一个锁");
    }
// 自定义锁线程阻塞
public static<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值