一、Lock接口
锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源(但是有些锁可以允许多个线程 并发的访问共享资源,比如读写锁)。在Lock接口出现之前,java程序靠synchronized关键字实现锁功能,在JDK SE 5 之后,并发包中新增了Lock接口,来实现锁功能,它提供了与synchronized类似的功能。它提供了与synchronized关键字类似的同步功能,只是在使用时需要显式地获取和释放锁。虽然它缺少了(通过synchronized块或者方法所提供的)隐式获取释放锁的便捷性,但是却拥有了锁获取与释放的可操作性、可中断的获取锁以及超时获取锁等多种synchronized关键字所不具备的同步特性。
使用synchronized关键字将会隐式地获取锁,但是它将锁的获取和释放固化了,也就是先获取再释放。当然,这种方式简化了同步的管理,可是扩展性没有显示的锁获取和释放来的好。
Lock的使用比较简单,看例子:
Lock lock = new ReentrantLock();// ReentrantLock()是Lock的实现类
lock.lock();
try{
...
}finally{
lock.unlock();
}
在finally块中释放锁,目的是保证在获取到锁之后,最终能够被释放。不要将获取锁的过程写在try块中,因为如果在获取锁(自定义锁的实现)时发生了异常,异常抛出的同时,也会导致锁无故释放。
Lock的API,它定义了获取锁和释放锁的基本操作:
Lock接口的基本实现都是通过聚合了一个同步器的子类来完成线程访问控制的。