synchronized:
1、依赖于JVM的底层实现;
2、获取到锁后,再执行完任务或者出现异常时会自动释放锁;
3、是非公平锁,也就是说一个线程可能会多次得到该锁;
4、是重量级锁,是悲观锁,类似于数据库直接加for update进行锁住。
ReentrantLock:
1、是Java的一个类,需要手动编码;
2、获取到锁后,需要手动释放,一般是在finally代码块中进行锁的释放;
3、可以根据需要,设定为公平锁或者非公平锁;
4、是轻量级锁,是乐观锁,类似于数据库version版本号字段。
synchronized和reetrantLock都是可重入锁,也就是说获得到锁后,当前线程还可以再次获得该锁;