Java并发编程的艺术(十)Lock接口
1、JDK5之后,并发包中新增了Lock接口(以及相关实现类)用来实现锁功能,它提供了与synchronized关键字类似的同步功能,只是在使用时需要显示地获取和释放锁。
2、synchronized关键字将会隐式地获取锁,但是它将锁的获取和释放固化了,也就是先获取再释放。这种方式简化了同步的管理,但是可扩展性没有Lock接口强。
3、Lock的使用:
(1)代码如下:
Lock lock = new ReentrantLock(); lock.lock(); try { } finally { lock.unlock(); }
(2)不要将获取锁的过程写在try块中,因为如果在获取锁(自定义锁的实现)时发生了异常,异常抛出的同时,也会导致锁无故释放。
(3)在finally块中释放锁,目的是保证在获取到锁之后,最终能够被释放。
4、Lock接口提供的synchronized不具备的特性:
(1)boolean tryLock():尝试非阻塞的获取锁,调用方法后立刻返回true或false。
(2)void lockInterruptibly() throws InterruptedException:可中断的获取锁,获取锁的线程能够响应中断,抛出中断异常同时释放锁。
(3)boolean tryLock(long time, TimeUnit unit) throws InterruptedException:超时获取锁,在超时时间内获取到锁、在超时时间内被中断或者超时时间结束的情况下返回。
5、Lock接口的实现基本都是通过聚合了一个同步器的子类来完成线程访问控制的。