可重入锁:支持一个线程对锁的重复获取。
公平锁/非公平锁:释放锁后按时间先后顺序获取锁/释放锁后所有线程均有机会获得锁,一般非公平锁效率更高

synchronized 是Java原生的互斥同步锁,是内置的语言实现,修饰方法或同步块,无需显示释放
ReentrantLock是API层面的互斥锁,需要显示的加锁解锁,遇到异常不会自动释放,一般配合try...catch...在finally中释放锁,防止死锁
可以创建多个condition对象,可以唤醒和休眠线程,某个condition.signal()唤醒的是该condition调用await()休眠的线程。