[Java-Thread]Lock的使用

420 阅读1分钟

Lock的使用

参考:

1、 Lock基本使用

1.1 语法

Lock接口ReentranLock就是Lock接口的实现类。

// 实例化一个对象(默认是非公平锁)
Lock lock = new ReentrantLock();
lock.lock();
try {
    // ..
} finally {
    //一定在finally中释放锁
    lock.unlock();
}

注意:

  1. finally 块中释放锁,目的是保证在获取到锁之后,最终能够被释放,否则会造成死锁
  2. 不要将获取锁的过程写在 try 块中:因为如果在lock.lock()获取锁)时发生了异常(即try中异常抛出),那么就会在finally中进行 lock.unlock()。 此时,由于获取锁时失败,那么释放锁时就会导致 IllegalMonitorStateException异常。

1.2 常用API

  • lock.lock():获取锁,如果锁被暂用则一直等待
  • lock.tryLock(): 获取锁,立即返回,不等待:如果获取锁的时候锁被占用就返回false,否则返回true
  • Lock.tryLock(long time, TimeUnit unit) throw InterruptedException:同lock.tryLock()只是多了获取锁的超时时间。
  • Lock.lockInterruptibly():获取锁时可以相应中断
  • lock.unlock():释放锁

1.2.1 Lock的Condition

接口:public interface Condition 创建:Condition condition = lock.newCondition()

它用来替代传统的Object的wait()、notify()

ConditionObject描述
await()wait()阻塞
signal()notify()唤醒
signalAll()notifyAll()