俩者共同点:1:都是可重入的(简单解释就是第一次获取锁,第二次可以不用和别的线程竞争再次获取锁资源)
2:都是独占锁(简单解释就是锁某个时刻只能被一个线程持有,对比共享形式可以有多个线程同时持有,Rreentrantwritereadlock的读锁就是可以共享的)
不同点:.synchronized 关键字 属于JVM层面的实现,所以可提供的功能简单: reentrantLock 属于Java语言层面,相比来说有很多功能使用与不同的业务场景.
举例:
1.等待可中断,持有锁的线程长期不释放的时候,正在等待的线程可以选择放弃等待,这相当于Synchronized来说可以避免出现死锁的情况。通过lock.lockInterruptibly()来实现这个机制
2:公平锁:Synchronized是非公平锁的实现,ReentrantLock提供了公平与非公平的实现.
公平锁与非公平锁的创建方式,公平锁会按照线程申请锁的时间顺序来优先获取锁.实现方式使用AQS维护了一个等待队列
图中标红处使用LockSupport了实现了线程等待.同样再unlock方法中就用了唤醒操作。
后续不同点再更新.