手撕源码系列之锁 -- 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();

猜你喜欢

转载自blog.csdn.net/pontuss/article/details/115413491