Lock的使用
- ReentrantLock类的使用
- ReentrantReadWriteLock类的使用
使用ReentrantLock类
在Java多线程中,可以使用synchronized关键字来实现线程之间的互斥,但在JDK1.5之后新增加了ReentrantLock类也能达到同样的效果,并且在扩展功能上也更加的强大,比如具有嗅探锁定、多路分支通知等功能,而且在使用上也比synchronized更加的灵活。
使用方法:将同步方法放在lock.lock()和lock.unlock()之间。
在使用ReentrantLock类时,可以使用Condition类中的await()方法、signal()方法和signalAll()方法实现等待/唤醒机制。在使用Condition类之后,可以实现唤醒特定线程的功能:创建多个Condition对象,使用特定Condition对象的signalAll()方法。
getHoldCount(): 方法 int getHoldCount()的作用是查询当前线程保持此锁定的个数,也就是调用lock()的次数。
getQueueLength(): 方法int getQueueLength()的作用是返回正等待获取此锁定的线程估计数。
getWaitQueueLength(Condition condition): 方法 int getWaitQueueLength(Condition condition)的作用是返回等待此锁定相关的给定条件Condition的线程估计数。
类ReentrantReadWriteLock
类ReentrantLock具有完全互斥排他效果,但是效率非常低下。在JDK中提供了一种读写锁ReentrantReadWriteLock类,使用它可以加快运行效率。读写锁表示也有两个锁,一个是读操作相关的锁,也成为共享锁,另一个是写相关的锁,称作排他锁。多个Thread可以同时进行读操作,但是同一时刻只允许一个Thread进行写入操作。