java.util.concurrent.locks包定义了一系列关于锁应用的类和接口,与前面文章中提到的对象内置加锁及等待-通知相比,它更加的灵活,可以说是一种改良方案。
接口Lock定义了锁机制的框架结构,它声明了如下重要的方法:1.lock方法来获取锁,当锁不可用时,调用线程会持续等待锁。2.lockInterruptibly方法获取锁,除非调用的线程被中断。3.unlock方法释放锁,这个方法与获取锁的方法一定要成对儿出现,每个锁被获取后一定要释放掉。其他方法请大家参考java doc文档,这里就不一一列出了。
ReentrantLock实现了接口Lock,它定义了一个可以重入的互斥锁。既然是重入锁,我们就可以使用任意获取锁的方法,比如lock、tryLock等方法重新获取锁,此时重入锁会把持有锁的数据加1,当调用unlock方法时此数据会减1,当此数据为0时,锁就会被释放掉。
可以通过构造器ReentrantLock()或者ReentrantLock(boolean fair)来完成一个重入锁的对象创建,无参的构造器会创建一个非公平策略的重入锁,而有参数的构造器可以跟据需要来定义公平策略。为了演示重入锁的应用,我们看一个实例:
例子中的主线程创建了两个Student对象,它们同时启动进入临界区并在其中执行模拟的洗漱操作。通过无参的构造器ReentrantLock()创建了重入锁对象,在run方法中通过lock方法获取锁,通过unlock方法释放锁,通常我们把unlock方法放到finally模块中执行,来确保锁释放的动作一定会被执行。
参考链接