特点(相比较于synchronized):
    ① 可中断等待:相比于synchronized的无限制竞争锁等待,使用ReentrantLock的tryLock方法可以设定等待时间进行锁获取,如果指定时间内获取不到则可以先执行其他代码;
    ② 公平锁支持:默认非公平锁,构造器传入true可以开启公平锁模式。在公平锁的模式下,锁释放之后,同步队列中的第一个被唤醒的线程会直接获得锁,如果此时有其他线程竞争锁会被加入同步队列;
    ③ 锁可绑定多个变量:synchronized仅可以隐式地绑定一个实例,这样有一个问题,使用notifyAll时会唤醒所有wait的对象进入锁竞争,而无法唤醒指定对象;对于ReentrantLock可以使用newCondition方法创建多个条件对象,之后调用await方法可以进入等待,其他线程想唤醒它可以使用signal(条件变量) 来唤醒它;