美文网首页
Java多线程(八)---Java中的锁---Lock接口

Java多线程(八)---Java中的锁---Lock接口

作者: brock | 来源:发表于2019-02-11 18:23 被阅读175次

    • 锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源(但是有些锁可以允许多个线程并发的访问共享资源,比如读写锁)。
    • 在Lock接口出现之前,Java程序是靠synchronized关键字实现锁功能的,而Java SE 5之后,并发包中新增了Lock接口(以及相关实现类)用来实现锁功能,它提供了与synchronized关键字类似的同步功能,只是在使用时需要显式地获取和释放锁

    1 lock的API

    lock是一个借口,它定义了锁获取和释放的基本操作

    方法名称 描述
    void lock() 获取锁,调用该方法当前线程将会获取锁,当锁获得后,从该方法返回
    void lockInterruptibly() throw InterruptedException 可中断地获取锁,和lock()方法不同之处在于该方法会响应中断,即在锁释放中可以中断当前线程
    boolean trylock() 尝试非阻塞式的获取锁,调用该方法后立刻返回,若果能够获取则返回true,否则返回false
    boolean tryLock(Long time,TimeUnit unit)throws InterruptedException 超时获取锁,当线程在一下三种情况会返回:1. 当前线程在超时时间内获得了锁 2. 当前线程在超时时间内被中断 3. 超时时间结束,返回false
    void unLock() 释放锁
    Condition newCondition() 获取等待通知组件,该组件和当前的锁绑定,当前线程只有获得了锁,才能调用该组件wait()方法,而调用后,当前线程释放锁。

    2 synchronized关键字 VS lock

    synchronized关键字

      1. synchronized关键字将会隐式地获取锁
      1. 将锁的获取和释放固化了,也就是先获取再释放。当然,这种方式简化了同步的管理,
      1. 扩展性差

    lock

      1. 拥有了锁获取与释放的可操作性
      1. 可中断的获取锁
      1. 超时获取锁。
      1. 尝试非阻塞地获取锁

    3 lock简单实用

    LockUseCase.java  Lock lock = new ReentrantLock();
    lock.lock();
    try {
    } finally {
        lock.unlock();
    }
    
    
    • 在finally块中释放锁,目的是保证在获取到锁之后,最终能够被释放。
    • 不要将获取锁的过程写在try块中,因为如果在获取锁(自定义锁的实现)时发生了异常,异常抛出的同时,也会导致锁无故释放。

    参考

    《java并发编程的艺术》

    相关文章

      网友评论

          本文标题:Java多线程(八)---Java中的锁---Lock接口

          本文链接:https://www.haomeiwen.com/subject/tqtceqtx.html