线程加锁有哪些方式?synchronized 和 Lock的区别

 Synchronized 和 Lock 的区别: Synchronized 编码更简单,锁机制由JVM维护,在竞争不激烈的情况下性能更好。Lock 性能更强大更灵活,竞争激烈时性能较好。

  • 性能不一样:资源竞争激烈的情况下,lock性能会比 synchronized 好;竞争不激烈的情况下,synchronized 会根据锁的竞争情况,从偏向锁 --> 轻量级锁 -->重量级锁升级,而且编程更简单。
  • 锁机制不一样:synchronized 在 JVM层面实现的,系统会监控锁的释放与否。Lock 是 JDK 代码实现的,需要手动释放,在 finally 块中实现。可以采用非阻塞的方式获取锁。
  • synchronized 的编程更简洁, lock的功能更多更灵活,缺点一定要在 finally 里面 unlock() 资源才行。
  • 用法不一样:synchronized 可以用在代码块上 或 方法上。 lock 只能写在代码里,不能直接修改方法。

Lock 支持的功能:

  • 公平锁:synchronized 是非公平锁, Lock 支持公平锁,默认非公平锁。
  • 可中断锁:ReentrantLock 提供了lockInterruptly() 的功能,可以中断争夺锁的操作,抢锁的时候会 check 是否被中断,中断直接抛出异常,退出抢锁。而 synchronized 只有抢锁的过程,不可干预,直到抢到锁以后,才可以编码控制锁的释放。
  • 快速反馈锁:ReentrantLock 提供了 trylock() 和 trylock(tryTimes) 的功能,不等待或者限定时间等待获取锁,更灵活。可以避免死锁的发生。
  • 读写锁:ReentrantReadWriteLock 类实现了读写锁的功能,类似于 Mysql, 锁自身维护一个计数器,读锁可以并发的获取,写锁只能独占。而synchronized 全是独占锁
  • Condition: ReentrantLock 提供了比 Synchronized 更精准的线程调度工具,Condition, 一个 lock可以有多个Condition。 比如在生产消费的业务下,一个锁通过控制生产 Condition 和 消费 Condition 精准控制。

猜你喜欢

转载自blog.csdn.net/ddwangbin520/article/details/131160257