Lock接口详情

版权声明:所属版权归博主所有,最终解释权归博主 https://blog.csdn.net/qq_40267817/article/details/82184446
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * Lock的使用方式
 */
public class LockUseCase {

    /**
     *在finally快中释放锁,目的使保证获取到锁后,最终能够被释放。
     * 不要将获取锁的过程写在try中,由于在获取锁(自定义锁的实现)时发生了
     * 异常抛出的同时,也会导致锁无故释放。
     *
     */
    public static void main(String[] args) {
        Lock lock=new ReentrantLock();
        lock.lock();
        try{
            //处理业务逻辑
        }finally {
            lock.unlock();
        }
    }
    /*
    Lock接口提供的synchronized关键字所不具备的主要特性
    ------------------------------------------------------------------------------------------------
            特性              |                               描述
    ------------------------------------------------------------------------------------------------
    尝试非阻塞地获取锁         | 当前线程尝试获取锁,若这一时刻锁没有被其他线程获取到,则成功获取并持有锁
    ------------------------------------------------------------------------------------------------
    能被中断地获取锁           | 与synchronized不同,获取到锁的线程能够响应中断,当获取到锁的线程被中断时
                              | 中断异常将会被抛出,同时锁会被释放
    --------------------------------------------------------------------------------------------------
    超时获取锁                 | 在指定的截至时间之前获取锁,若截至时间到了仍旧无法获取锁,则返回
    ----------------------------------------------------------------------------------------------------
     */

    /*
    Lock是一个接口,它定义了锁获取和锁释放的基本操作
    ,其实现基本上通过聚合了一个同步器的子类来完成线程访问
    控制的。
    API如下
     */

    //获取锁,调用该方法当前线程将会获取锁,当锁获得后,从该方法返回
    public void lock() {}
    //可中断地获取锁,和lock()方法的不同之处在于该方法会响应中断,即在
    //锁的获取中可以中断当前线程
    public void lockInterruptibly() throws InterruptedException {}
    //尝试非阻塞的获取锁,调用该方法后立刻返回,若能获取则返回true,反之亦然。
    public boolean tryLock() {
        return false;
    }
    /*
    超时的获取锁,当前线程在以下3种情况下会返回
    1.当前线程在超时时间内获得了锁
    2.当前线程在超时时间内被中断
    3.超时时间结束,返回false
     */
    public boolean tryLock(long time, TimeUnit unit) throws InterruptedException {
        return false;
    }
    //释放锁
    public void unlock() { }
    /*
    获取等待通知组件,该组件和当前的锁绑定,当前线程只有获取了锁,才能调用该
    组件的wait()方法,而调用后,当前线程将释放锁。
     */
    public Condition newCondition() {
        return null;
    }


}

猜你喜欢

转载自blog.csdn.net/qq_40267817/article/details/82184446