面试经典问题系列:Synchronized与Lock的区别

本文详细比较了Java中的Synchronized关键字与Lock接口在锁的获取、释放、死锁、状态、类型及性能方面的差异,强调了Lock的可定制性和底层实现机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如果面试官问你Synchronized与Lock的区别的时候,可以按照一下几条回答.显得更加具有条理性

存在层次上

  • Synchronized是java关键字,在jvm层面上

  • Lock:是一个接口

锁的释放

  • Synchronized:1、以获取锁的线程执行完同步代码,释放锁 2、线程执行发生异常,jvm会让线程释放锁

  • Lock:在finally中必须释放锁,不然容易造成线程死锁

锁的获取

  • synchronized:假设A线程获得锁,B线程等待。如果A线程阻塞,B线程会一直等待

  • Lock:分情况而定,Lock有多个锁获取的方式,大致就是可以尝试获得锁,线程可以不用一直等待(可以通过tryLock判断有没有锁)

锁的释放(死锁产生):

  • synchronized:在发生异常时候会自动释放占有的锁,因此不会出现死锁

  • Lock:发生异常时候,不会主动释放占有的锁,必须手动unlock来释放锁,可能引起死锁的发生

锁的状态

  • synchronized:无法判断

  • Lock:可以判断

锁的类型

  • synchronized:可重入 不可中断 非公平

  • Lock:可重入 可判断 可公平(两者皆可)

性能

  • synchronized:少量同步

  • Lock:大量同步

用法

  • synchronized:在需要同步的对象中加入此控制,synchronized可以加在方法上,也可以加在特定代码块中,括号中表示需要锁的对象

  • Lock:一般使用ReentrantLock类做为锁。在加锁和解锁处需要通过lock()和unlock()显示指出。所以一般会在finally块中写unlock()以防死锁。

底层实现

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值