ReentrantLock 是针对不同用例的不同工具。虽然您可以将两者用于大多数同步问题(这就是它们的用途),但它们具有不同的优点和缺点。
Synchronized 最多很简单:您编写 synchronized 就可以了。对于现代 JVM,它的速度相当快,但它的缺点是它会暂停所有尝试进入同步块的线程,无论它们是否真的需要。如果您过于频繁地使用同步,这会显着降低多线程的速度,最坏的情况会降低到单线程执行速度更快的程度。
由于线程问题仅在某人正在写入而其他人正在读取/写入相同的数据部分时才会发生,因此程序经常会遇到问题,理论上它们可以在没有同步的情况下运行,因为大多数线程只是读取,但偶尔会出现这样的写入,它强制执行同步块。这就是锁的用途:您可以更好地控制实际同步的时间。
基本的 ReentrantLock 允许 - 除了构造函数中的公平参数之外 - 您可以决定何时释放锁,并且您可以在多个点执行此操作,因此何时最适合您。它的其他变体如 ReentrantReadWriteLock 允许您进行许多非同步读取,除非有写入。缺点是这是在 Java 代码中解决的,这使得它明显比“本机”同步块慢。也就是说:只有在您知道使用此锁的优化增益大于损失时,您才应该使用它。
在正常情况下,如果您实际监控速度,您只能通过运行分析器以复杂的方式检查前后速度的差异。