ReentrantLock
与 synchronized的异同点:
相同:都支持可重入
可重入:可重入是指同一个线程如果首次获得了这把锁,那么因为它是这把锁的拥有者,因此有权利再次获取这把锁 如果是不可重入锁,那么第二次获得锁时,自己也会被锁挡住
@Slf4j(topic = "c.TestReentrant")
public class TestReentrant {static ReentrantLock lock = new ReentrantLock();public static void main(String[] args) {method1();}public static void method1() {lock.lock();try {log.debug("execute method1");method2();} finally {lock.unlock();}}public static void method2() {lock.lock();try {log.debug("execute method2");method3();} finally {lock.unlock();}}public static void method3() {lock.lock();try {log.debug("execute method3");} finally {lock.unlock();}}
}
不同:对于 synchronized它具备如下特点
可中断
可以设置超时时间
可以设置为公平锁
公平锁一般没有必要,会降低并发度;可以使用tryLock()去设置超时时间。
支持多个条件变量
送烟、送外卖的例子;
多个条件变量,对应多个等待区;