synchronized和lock锁的个人浅见

这是一个老掉牙的面试题,但是还有面试官在问,因为确实经典,也确实能区分求职者有没有真正理解锁机制。 

百度搜二者区别可得到以下答案:

内置关键字 vs 接口:
1、synchronized 是Java中的一个内置关键字,它是自动的、隐式的,当一个方法被声明为同步时,会自动获取并释放对象的监视器锁。
lock 是java.util.concurrent包中的Lock接口的一部分,是一个显式、可配置的锁定机制,可以提供更精细的控制,如非阻塞尝试获取锁等。
作用范围:
2、synchronized 可以修饰方法或代码块,作用于整个方法或代码块,在进入或离开这个作用域时控制锁的获得和释放。
lock 通常配合try-finally或try-with-resources使用,可以在任意代码块上获取锁,并且明确地调用unlock()方法释放锁。
异常处理:
如果synchronized代码块中抛出未捕获的异常,锁会自动被释放。
使用lock时,如果发生未被捕获的异常,程序员需要手动调用unlock()来释放锁,否则可能导致死锁。
公平性:
3、synchronized默认是非公平的,即线程调度没有保证先来的线程一定先获取锁。
ReentrantLock(Lock接口的一个实现)提供了公平模式,可以设置为公平策略,确保所有线程按照到达顺序获取锁。
性能:
在某些情况下,由于synchronized是自动的,可能会有一些开销。而lock更灵活,可能提供更好的性能优化。

个人认为从这几个方面回答比较好:

1、synchronized是c++实现的,在java层面是一个关键字。lock锁是java实现的,道格李大佬写的,底层是基于cas。---表象以及整体认知

2、synchronized ,作用于整个方法或代码块,在进入或离开这个作用域时控制锁的获得和释放,可以锁对象,或者锁类(说一下加方法上、加代码块上、使用this、使用.class、使用创建的对象、哪些对象不适合加锁),同一个类方法上使用是同一把锁,异常自动释放,只能是非公平锁。

lock,手动在finally中调用unlock()来释放锁,如果需要可以使用读写锁,可以使用公平锁(condition队列控制)---使用上

3、synchronized锁升级原理、lock的AQS原理--原理上

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值