Lock接口

锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源。在lock接口出现之前程序是靠synchronized关键字实现锁功能,lock接口提供了与synchronized关键字类似的同步功能,只是在使用的过程中需要显示的获取和释放锁。

缺点:缺少隐士获取释放锁的便捷性

有点:拥有锁获取与释放的可操作性,可中断的获取硕=锁以及超市获取锁等特性

适合Lock的场景:

先获取锁A,然后在获取锁B,当锁B获得后,释放锁A同时获取锁C,当锁C获取后,在释放B同时获取锁D。

lock示例

 ReentrantLock lock = new ReentrantLock();
      lock.lock();
      try {
      }finally {
    	  lock.unlock();
      }

注意

1、在finally里释放锁,目的是保证获取到锁后,最终能够被释放

2、不要讲获取锁的过程卸载try块中,因为如果在获取锁时发生了异常,异常抛出的同时,也会导致锁无故释放

 

Lock接口提供的synchronized关键字不具备的主要特性

特性 描述
尝试非阻塞的获取锁 当前线程尝试获取锁,如果如果这一时刻锁没有被其它的线程获取到,则成功获取并持有锁
能被中断的获取锁 获取到锁的线程能够响应中断,当前获取到锁的线程被中断时,中断异常将会被抛出,同时锁会被释放
超时获取锁 在指定的截止时间之前获取锁,如果截止时间到了仍旧无法获取锁,则返回

 

Lock基本Api

方法名称 描述
void lock() 获取锁,调用该方法线程将会获取锁,当获取锁后,从该方法返回
void lockInterruptibly() throws InterruptedException 可中断获取锁,和lock方法的不同之处在于该方法会响应中断,即在锁的获取中可以中断当前线程
boolean tryLock() 尝试非阻塞的获取锁,调用该方法立即返回,如果能够获取在返回true,否则返回true
boolean tryLock(long time,TimeUnit unit) hrows InterruptedException

超时获取锁,当前线程在以下3中情况下回返回

1、当前线程在超时时间内获取了锁

2、当前线程在超时时间内被中断

3、超时时间结束,返回false

void unlock() 释放锁

Condition newCondition()

获取等待通知组件,该组件和当前锁绑定,当前线程只有获取了锁,才能调用该组件的wait()方法。调用后,当前线程将释放锁

你可能感兴趣的:(文章,java,线程并发,java线程并发)