为什么ReentrantLock不能完全替代synchronized?

  • 《java并发编程实战》上说是因为如果使用Reentrantlock时,你没有释放锁很难追踪到最初发生错误的位置,因为没有记录应该释放锁的位置和时间。

为什么ReentrantLock不能完全替代synchronized?

  • 在JDK1.5中,synchronized是性能低效的。因为这是一个重量级操作,它对性能最大的影响是阻塞的是实现,挂起线程和恢复线程的操作都需要转入内核态中完成,这些操作给系统的并发性带来了很大的压力。相比之下使用Java提供的ReentrankLock对象,性能更高一些。
  • 到了JDK1.6,发生了变化,对synchronize加入了很多优化措施,有自适应自旋,锁消除,锁粗化,轻量级锁,偏向锁等等。导致在JDK1.6上synchronize的性能并不比Lock差。
  • 官方也表示,他们也更支持synchronize,在未来的版本中还有优化余地,所以还是提倡在synchronized能实现需求的情况下,优先考虑使用synchronized来进行同步。

 

什么时候选择使用synchronized,什么使用选择使用ReentrantLock?

synchronized不能满足的情形:

  • 公平性(ReentrantLock可设置为公平锁
  • 中断性(ReentrantLock可中断
  • 分块结构的加锁(?)