源码分析--Lock&ReentrantLock

16 篇文章 0 订阅

概述

涉及多线程问题,往往绕不开「锁」。在 JDK 1.5 之前,Java 通过 synchronized 关键字来实现锁的功能,该方式是语法层面的,由 JVM 实现。JDK 1.5 增加了锁在 API 层面的实现,也就是 java.util.concurrent.locks.Lock 接口及其相关的实现类,它不仅具备 synchronized 的功能,而且还增加了更加丰富的功能。
Reentrant = Re + entrant,Re是重复、又、再的意思,entrant是enter的名词或者形容词形式,翻译为进入者或者可进入的,所以Reentrant翻译为可重复进入的、可再次进入的,因此ReentrantLock翻译为重入锁或者再入锁。
在这里插入图片描述

源码分析

Lock 接口的定义如下:

public interface Lock {
    // 阻塞式获取锁,该方法与synchronized功能类似
    void lock();

    // 获取锁,可响应中断
    void lockInterruptibly() throws InterruptedException;

    // 尝试获取锁,若成功返回true;否则返回false
    boolean tryLock();

    // 尝试获取锁(在给定的时间内),若成功返回true;否则返回false
    boolean tryLock(long time, TimeUnit unit) throws InterruptedException;

    // 释放锁
    void unlock();

    // 创建一个与该锁绑定的Condition
    Condition newCondition();
}

Lock接口中主要定义了 获取锁、尝试获取锁、释放锁、条件锁等几个方法。

ReentrantLock构造方法:

// 默认构造方法
public ReentrantLock(){
    sync = new NonfairSync();
}

// 自己可选择使用公平锁还是非公平锁
public ReentrantLock(boolean fair){
	sync = fair ? new FairSync():new NonfairSync();
}

(1)默认构造方法使用的是非公平锁;
(2)第二个构造方法可以自己决定使用公平锁还是非公平锁;

ReentrantLock主要内部类

abstract static class Sync extends AbstractQueuedSynchronizer {}

static final class NonfairSync extends Sync {}

static final class FairSync extends Sync {}

(1)抽象类Sync实现了AQS的部分方法;

(2)NonfairSync实现了Sync,主要用于非公平锁的获取;

(3)FairSync实现了Sync,主要用于公平锁的获取。

在这里我们先不急着看每个类具体的代码,等下面学习具体的功能点的时候再把所有方法串起来。

常用方法后续学习补充~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值