Java中的锁之Lock接口

  从JDK5开始,并发编程大师Doug Lea加入了Lock接口,为Java语言中的并发处理加入了一股清流,先来认识一下这个接口:

  首先要知道锁是来干嘛的?锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源(但是有些锁可以允许多个线程并发的访问共享资源,比如读写锁)。在Lock接口出现之前,Java程序是靠synchronized关键字实现锁功能的,而Java SE 5之后,并发包中新增了Lock接口(以及相关实现类)用来实现锁功能,它提供了与synchronized关键字类似的同步功能,只是在使用时需要显式地获取和释放锁。虽然它缺少了(通过synchronized块或者方法所提供的)隐式获取释放锁的便捷性,但是却拥有了锁获取与释放的可操作性、可中断的获取锁以及超时获取锁等多种synchronized关键字所不具备的同步特性。

  使用synchronized关键字将会隐式地获取锁,但是它将锁的获取和释放固化了,也就是先获取再释放。当然,这种方式简化了同步的管理,可是扩展性没有显示的锁获取和释放来的好,而使用Lock却容易许多。Lock接口提供的synchronized关键字不具备的主要特性有三点:尝试非阻塞地获取锁、能被中断地获取锁和超时获取锁。对于以上源码中的API,做一下解释:

void lock():获取锁,调用该方法当前线程将会获取锁,当锁获得后,从该方法返回。

void lockInterruptibly() throws InterruptedException:可中断地获取锁,和lock()方法不同之处在于该方法会响应中断,即在锁的获取中可以中断当前线程。

boolean tryLock():尝试非阻塞的获取锁,调用该方法后立即返回,如果能够获取则返回true,不能则返回false。

boolean tryLock(long time, TimeUnit unit) throws InterruptedException:超时的获取锁,当前线程会在下面情况下返回:当前线程在超时时间内获取了锁、当前线程在超时时间内被中断、超时时间结束返回false。

void unlock():释放锁。

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

Lock接口的实现基本都是通过聚合了一个同步器的子类来完成线程访问控制的。我们常用的重入锁ReentrantLock就是实现了Lock接口。

猜你喜欢

转载自blog.csdn.net/Apeopl/article/details/82621352