手撕源码系列之锁 -- LOCK(一)(基于JDK1.8)

手撕源码系列之锁 -- LOCK

Lock

Lock 是JDK在1.5版本提供的Java.util.concurrent.locks包下的锁相关内容。
功能是为了补充Sychronized缺乏的相关功能。
关于Sychronized的优劣会在Sychronized内讲解(尚未提供)

源码:

public interface Lock {

    /**获取锁 ,如果当前锁被其他线程获取则等待直到获取锁*/
    void lock();

    /** 功能和lock差不多 , 但是区别点在于在当前线程在等待锁的过程中被中断,那么会退出等待,并抛出中断异常*/
    void lockInterruptibly() throws InterruptedException;

    /**无参方法,尝试获取锁,并立即返回,返回类型为布尔类型,代表是否获取锁*/
    boolean tryLock();

    /**含参方法,在一段时间内获取锁,如果期间内被中断则抛出异常*/
    boolean tryLock(long time, TimeUnit unit) throws InterruptedException;

    /** 释放锁 */
    void unlock();

    /**新建一个绑定在当前Lock方法上的Condition*/
    Condition newCondition();
}

Condition对象

Condition 和Lock一样同是在java.util.concurrent.locks目录下的一个对象。Condition是条件队列接口,提供类似于Object监视器方法 ,可与Lock实现等待/通知模式

我们知道Object对象提供了wait、waitAll、notify、notifyAll的方法用来实现线程的同步、等待和唤醒。但Condition类提供了比wait/notify更丰富的功能,Condition对象由lock对象所创建的,同时一个Lock可以创建多个Condition对象,即创建多个对象监听器,这样就可以指定唤醒具体线程,而notify是随机唤醒线程。

Condition源码:


    /* 当前线程在接到信息或者中断之前一直保持等待状态 , 中断的时候抛出中断异常*/
    void await() throws InterruptedException;

    /** 当前线程在接到信息或者中断之前一直保持等待状态 */
    void awaitUninterruptibly();

    /**含参方法,使当前线程在接到信号、被中断或到达指定等待时间之前一直处于等待状态*/
    long awaitNanos(long nanosTimeout) throws InterruptedException;

    /**造成当前线程在接到信号、被中断或到达指定最后期限之前一直处于等待状态。 */
    boolean await(long time, TimeUnit unit) throws InterruptedException;

    /**唤醒一个等待线程。*/
    void signal();

    /**唤醒所有等待线程*/
    void signalAll();
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值