synchronized与lock的区别 - 阿里技术面试

1. 问题背景

在 Java 并发编程中,锁有两种实现:

  • synchronized

  • lock

在面试中,从解决并发的功能角度来说,它们都能通过上锁的方式,解决对资源的抢占问题。

但是它俩的区别是什么呢?

2. synchronized与lock的区别

2.1 底层实现机制不同

  • synchronized: Java 中的关键字,是由 JVM 来维护的,是 JVM 层面的锁。

  • lock:是 JDK5 以后才出现的具体的类,使用lock是调用对应的API,是API层面的锁

synchronized 是底层是通过 monitorenter 进行加锁,通过monitorexit来退出锁的。

实现机制是底层是通过monitor对象来完成的,其中的 wait/notify 等方法也是依赖于 monitor 对象的。

而 lock 是通过调用对应的 API 方法来获取锁和释放锁的。

2.2 使用方式不同

  • synchronized 是隐式锁。

  • lock 是显示锁。

所谓的显示和隐式就是在使用的时候,使用者要不要手动写代码去获取锁和释放锁的操作。

在使用 synchronized 关键字的时候,由程序自动获取锁和释放锁了,如果非逻辑问题的话话,是不会出现死锁的。

在使用 lock 的时候,我们使用者需要手动的获取和释放锁。如果没有释放锁,就有可能导致出现死锁的现象。手动获取锁方法:lock.lock()。释放锁:unlock方法。需要配合tyr/finaly语句块来完成。

2.3 等待的处理方式不同

  • synchronized 是不可中断的,除非抛出异常或者正常运行完成。

  • lock 可以中断的。

lock 调用设置超时方法 tryLock(long timeout ,timeUnit unit),也可以调用 lockInterruptibly() 放到代码块中,然后调用 interrupt() 方法可以中断。

2.4 加锁的时候是否可以公平

  • synchronized 非公平锁。

  • lock 两者都可以的,默认是非公平锁,在其构造方法的时候可以传入Boolean值来决定。

2.5 性能比较

  • synchronized 由于给jvm 托管,在 Java1.5 中性能较为低效, Java 1.6 中进行了优化。

  • lock 相比 synchronized 性能要好些。

2.6 锁的方式

  • synchronized 悲观锁。

  • lock 乐观锁。


相关主题:
相关推荐
  1. Python公开课 - 标准库Thread详解
  2. 哼哼猪的大衣
  3. 奥迪客户不满加价,被武汉4S店销售群殴
  4. 蚂蚁小黑豆儿
  5. Python公开课 - 多进程使用
  6. 武汉市东西湖区手拉手幼儿园 - 武汉幼儿园黄页
  7. 易中天给英雄武汉的一首诗 - 武汉新鲜事
  8. 广州市海珠区桂田怡童幼儿园(原格林幼儿园) - 广州幼儿园黄页
  9. 王导平乱
  10. 百名网媒总编辑登上知音号欣赏武汉夜色
  11. 狗和公鸡和狐狸
  12. Ubuntu中如何安装pip3
  13. HashMap底层结构与JVM内存模型 - 阿里技术面试
  14. Python公开课 - Django配置极验证geetest教程
  15. 广州市荔湾区精博中英文小学
  16. 石家庄国泰街小学
  17. 佛山市顺德区勒流中心小学
  18. 上海市第二师范学校附属小学(上海二师附小)
  19. 深圳市六约学校小学部
  20. 武汉00后大二学妹拍视频月入七十万
  21. 上海长宁区北新泾第二小学
  22. 北京市朝阳区首都国际机场第三幼儿园 - 北京幼儿园黄页
  23. 守株待兔的故事由来
  24. 武汉一女子七天被骗220万
  25. 武汉市黄陂区大潭幼儿园 - 武汉幼儿园黄页
  26. 广州市白云区钟落潭镇五龙岗村幼儿园 - 广州幼儿园黄页
  27. 事发武汉农夫山泉矿泉水内惊现大量虫卵
  28. 亲情树幼稚园 - 成都市幼儿园黄页
  29. 上海市徐汇区建襄小学
  30. 多活容灾解决方案
  31. 央媒聚焦!国庆假期173.78万人次打卡大美黄陂
  32. 警方通报:武汉男子持刀至五死一伤,嫌犯已跳桥
  33. 武汉动物园火烈鸟孔雀排队打疫苗
  34. 武汉市江夏区大花岭幼儿园 - 武汉幼儿园黄页
  35. 济南市杨庄小学
  36. 两只小熊
  37. Nginx Location 匹配设置
  38. 喜鹊道歉
  39. 桂林市荔浦县喜洋洋双语幼儿园 - 桂林幼儿园黄页
  40. Python公开课 - Django自定义404/404/500页面的两种方法
  41. 南宋的拆迁补偿
  42. 桂林市阳朔县小天才幼儿园 - 桂林幼儿园黄页
  43. 黄昏的向日葵
  44. 广州市白云区沙龙小学
  45. 赶鸭子上架
  46. 上海市奉贤区博雅幼儿园 - 上海幼儿园黄页
  47. Python公开课 - 爬虫介绍
  48. ubuntu环境安装opencv与python-opencv
  49. 上海交通大学附属小学
  50. 脱单!武汉的相亲角在哪你知道吗?