synchronized和Lock比较

7 篇文章 0 订阅
2 篇文章 0 订阅
  • Synchronized和Lock都是可重入锁,但synchronized不是可中断锁,而Lock是可中断锁。

  • Synchronized底层:使用指令码方式来控制锁的,映射成字节码指令就是增加两个指令:monitorenter和monitorexit。当线程执行遇到monitorenter指令时会尝试获取内置锁,如果获取锁则锁计数器加1,如果获取锁则阻塞;当线程遇到monitorxit指令是则锁计数器-1,如果计数器为0则释放锁。

  • Lock的底层:是CAS乐观锁,依赖AbstractQueuedSynchronizer类,把所有的线程构成一个自旋锁队列。而对该队列的操作均通过Lock-Free(CAS)操作。

  • Synchronized是关键字, 内置语言实现,Lock是接口。

  • Synchronized在线程发生异常时会自动释放锁,因此不会发生异常死锁;Lock异常时不会自动释放锁,需要在finally中实现释放锁。

  • Lock是可中断锁;Synchronized是非中断锁,必须等待线程执行完成释放锁。

  • Lock可以使用读锁提高多线程并发读的效率。

Synchronized优点:实现简单,语义清晰,便于JVM堆栈追踪,加锁解锁过程由JVM自动控制,提供了多种优化方案,使用更广泛。

Synchronized缺点:悲观的排他锁,不能进行高级功能。

Lock优点:可定时的、可轮询的与可中断的获取锁操作,提供了读写锁(ReentrantReadWriteLock),公平锁和非公平锁。

Lock缺点:需要手动释放锁(unlock),不适合JVM进行堆栈追踪。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值