ReentrantLock 介绍
ReentrantLock 是可重入锁,synchronized也是可重入锁,即可以频繁加锁同时不造成死锁;
ReentrantLock 是一个类,在使用时要创建实例locker;
locker.lock()即加锁,locker.unlock()即解锁,将可能会引发线程安全的代码放到这两个之间;
由于ReentrantLock 不像synchronized出代码块就是释放锁操作,可能会忘记写unlock或者代码执行到中途直接被return了,于是可以将locker.lock()与线程不安全代码放到try中,在finally中写locker.lock(),于是最终都会将锁释放。
synchronized与ReetrantLock的区别
1.synchronized是关键字,是由JVM用C++实现;ReentrantLock 是标准库中的类;
2.synchronized是通过代码块来进行锁操作,进入代码块即加锁,出代码块即解锁;ReentrantLock 是通过两个方法实现加锁与释放锁,分别为lock()加锁,unlock()解锁;
3.ReentrantLock 中有方法tryLock(),即可以判断是否加锁成功,若成功返回true,失败则返回false,同时也可以向tryLock()中传入时间time,单位ms,即超过time后才会返回true/false;
4.虽然ReetrantLock与synchronized均是非公平锁,但ReentrantLock 可以在创建实例时传入true将锁修改为公平锁,但ReentrantLock 默认是非公平的;
ReentrantLock locker = new ReentrantLock(true);
5.ReentrantLock 的等待唤醒机制是Condition类,有await()/signal()或signalAll(),synchronized则是通过wait()和notify()进行等待和唤醒;