Synchronized 和 ReentrantLock 它们都是用来实现线程同步的工具,但它们的实现原理是不同的。
Synchronized 是 JVM 基于监视器的实现,提供的内置锁,即每个对象都有一个监视器锁(monitor),当线程进入 synchronized 当代码块时,它会尝试获得该对象的监视器锁,如果获得成功,它可以执行代码块,如果获得失败,它将被阻塞,等待锁释放。
ReentrantLock 是基于可重入锁的可重入锁 AbstractQueuedSynchronizer(AQS)的实现,AQS 用于实现同步器的框架,ReentrantLock 利用了 AQS 实现锁定功能的一些特点。ReentrantLock 相对于 Synchronized 例如,它提供了两种模式:公平锁和非公平锁,以及可中断获取锁和加班获取锁。
另外,ReentrantLock 还支持 Condition 条件变量允许线程在获得锁后等待条件满足后执行。
总的来说,Synchronized 如果不需要特别高的灵活性和控制能力,可以直接使用简单易用的锁定机制 Synchronized。而 ReentrantLock 它更灵活,可以提供更多的控制和功能,但使用相对复杂。