1.synchronized是java语言的关键字,依赖于 JVM 实现,ReentrantLock是一个类,是API层面实现的。
    2.synchronized不需要用户去手动释放锁,当synchronized方法或者synchronized代码块执行完或者发生异常,系统会自动让线程释放对锁的占用,ReentrantLock必须要用户去手动释放锁,如果没有主动释放锁,就有可能导致死锁。
    3.synchronized是非公平锁,ReentrantLock默认情况是非公平锁,可以向构造方法传入boolean值来指定使用公平锁还是非公平锁。
    4.ReentrantLock调用lockInterruptibly方法等待锁时可以响应中断,调用tryLock方法可以传入时间参数,表示等待指定的时间,如果在指定的时间内没有获取到锁就不再等待,等待期间也是可以响应中断的,使用synchronized时,等待的线程会一直等待下去,不能够响应中断。
    5.ReentrantLock可以通过调用tryLock方法来知道有没有获取锁,而synchronized不能。
    6.ReentrantLock结合Condition可以实现选择性通知,指定唤醒哪些线程,synchronized不行。