并发编程面试题之synchronized和ReentrantLock的区别


并发编程面试文章地址链接

内容 博客链接
并发编程面试题之常见面试题 https://blog.csdn.net/weixin_38251871/article/details/104658674
并发编程面试题之 volatile 关键字 https://blog.csdn.net/weixin_38251871/article/details/104667384
并发编程面试题之 CAS https://blog.csdn.net/weixin_38251871/article/details/104667406
并发编程面试题之锁 https://blog.csdn.net/weixin_38251871/article/details/104667392
并发编程面试题之阻塞队列 待完成…
并发编程面试题之 AQS 待完成…
并发编程面试题之线程池 待完成…
并发编程面试题之 synchronizedReentrantLock 的区别 https://blog.csdn.net/weixin_38251871/article/details/104667532
并发编程面试题之 CyclicBarrier、CountDownLatch、Semaphore 待完成…
并发编程面试题之 ConcurrentHashMap https://blog.csdn.net/weixin_38251871/article/details/104667433
并发编程面试题之 synchronized 实现原理 https://blog.csdn.net/weixin_38251871/article/details/104667415

相同点

  • 都是协调多线程对共享资源的访问
  • 都是可重入锁, 同一个线程可以多次获得同一个锁
  • 都保证了可见性和互斥性

不同点

  • ReentrantLock 是类, 而 synchronized 是和 if、else、for、while 等关键字是一样的, 是内置语言的实现, 这是本质上的区别
  • ReentrantLock 可以在创建锁的时候选择是否创建公平锁, 而 synchronized 只能创建非公平锁
  • ReentrantLockAPI 级别的, 而 synchronizedJVM 级别的
  • ReentrantLock 可以显示的获取锁和释放锁, 而 synchronized 只能隐式的获取锁
  • ReentrantLock 是类, 提供了比 synchronized 更多更灵活的特性【例: 可响应中断、可轮回】, 为处理锁的不可用性提高了灵活性
  • ReentrantLock 底层采用的是同步非阻塞 - 乐观并发策略, 而 synchronized 采用的是同步阻塞 - 悲观并发策略
  • ReentrantLock 可以获取锁的信息, 而 synchronized 不可以
  • ReentrantLock 可以对获取锁的等待时间进行设置, 这样可以防止出现死锁, 而 synchronized 不可以
  • ReentrantLock 可以提高多个线程进行读操作的效率【例:ReentrantReadWriteLock
  • ReentrantLock 在异常发生的时候, 如果没有主动通过 Lock#unlock() 方法去释放锁, 可能会造成死锁的现象, 所以在使用 ReentrantLock 的时候需要在 finally 代码块中释放锁资源, 而 synchronized 在发生异常的时候会自动地释放锁资源
  • ReentrantLock 还可以通过 Condition 类绑定多个条件【注: Conditionawait()/signal()/signalAll()Objectwait()/notify()/notifyAll() 差不多 】
发布了17 篇原创文章 · 获赞 3 · 访问量 536

猜你喜欢

转载自blog.csdn.net/weixin_38251871/article/details/104667532