synchronized和Lock的区别

Lock也就是ReentrantLock,和synchronized一样都是可重入锁,即同一个线程再次进入同步代码中可以直接使用自己已经获得的锁定

  1. synchronized是在JVM层面上实现的,代码执行出现异常会自动释放锁,ReentrantLock是Java代码实现的类,要释放锁,必须在finally{}中执行unLock方法;
  2. ReentrantLock是可以中断的,而synchronized是不可中断的
    • 例:A,B两个线程都需要获得对象Obj的锁定,假设A获得了Obj的锁定,B等待A释放锁定
      • 如果使用synchronized,A不释放,B将一直等待
      • 如果使用ReentrantLock,A不释放,B可以在等待一段时间后,中断等待,去做别的事情
  3. 资源竞争不激烈的情况下,synchronized的性能要优于ReentrantLock,但是在资源竞争激烈的情况下,synchronized性能下降几十倍,而ReentrantLock性能维持稳定
  4. synchronized是悲观锁机制,独占锁;而ReentrantLock是乐观锁机制,每次不加锁而是假设没有冲突去完成某项操作,如果因为冲突失败就重试,直到成功为止
  5. ReentrantLock可以分开处理wait-notify,ReentrantLock中的Condition应用可以控制notify哪个线程,锁可以绑定多个条件
  6. 具有公平锁的功能,使线程按照请求顺序依次获得锁(健壮性高,但是性能低)
posted @ 2018-03-08 14:56  *青锋*  阅读(717)  评论(0编辑  收藏  举报