Java中的锁 | Sychronized & Lock 的区别
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java中的锁 | Sychronized & Lock 的区别,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1687字,纯文字阅读大概需要3分钟。
内容图文
![Java中的锁 | Sychronized & Lock 的区别](/upload/InfoBanner/zyjiaocheng/595/8c409a3f03f24a87a61b7e693cc83eba.jpg)
Java中的锁 | Sychronized & Lock 的区别
1. 相同点
- 用来做代码块的同步控制
- 都是可重入锁
2. 不同点
- 来源不同
- Synchronized是Java提供的关键字,属于Java语法层面的互斥锁,也称“隐式锁”。竞争锁、释放锁的过程开发者无需关心也不能干预,由JVM来完成。
- Lock是指
java.util.concurrent
包下的Lock接口,描述的是一把同步锁,由Java代码来控制多线程同步,也称“显式锁”。可以自己实现一把锁,也可以直接使用由并发大神Doug Lea编写的ReentrantLock
。
- 锁的释放不同
- Synchronized锁的释放由JVM来完成,开发者无法干预。同步代码块运行结束,或者出现异常JVM均会释放锁。
- Lock加的锁必须开发者手动释放,如果同步代码块抛了异常,锁没释放则会发生死锁,一般释放锁代码建议写在
finally
块中,确保锁一定释放。
- 性能不同
- Synchronized在JDK6之前,采用OS级别的互斥锁,竞争锁失败的线程会被挂起,性能非常低,JDK6做了大量优化,会自动进行锁膨胀,降低了锁开销,性能提升很大,但是竞争激烈时性能还是会下降。
- Lock不管锁竞争激烈与否,性能基本保持在一个数量级,适合锁竞争比较激烈的应用场景。
- 竞争锁失败的线程状态不同
- Synchronized竞争锁失败的线程状态是:BLOCKED。
- Lock竞争锁失败的线程状态是:WAITING。
- JVM堆栈跟踪
- Synchronized阻塞的线程更加便于JVM跟踪,使用jstack可以清楚的看到。
- Lock通过LockSupport.park()来阻塞线程,不利于JVM跟踪。
- 响应中断
- Synchronized不支持响应中断,竞争不到锁会一直阻塞。
- Lock支持响应中断。
- 锁超时
- Synchronized不支持锁超时,竞争不到锁会一直死等,容易造成死锁。
- Lock支持锁超时,在给定时间内获取不到锁可以进行其他处理。
- 公平/非公平锁
- Synchronized采用非公平锁,且不允许修改,可能会造成“线程饿死”。
- Lock支持公平锁与非公平锁,开发者可以自己选择。
- 尝试获取锁判断
- Synchronized不支持获取锁成功与否的判断。
- Lock支持。
- 读写锁
- Synchronized不支持读写锁,对于读多写少的场景无法优化性能。
- Lock支持读写锁,读读不互斥,对于读多写少的场景可以进一步优化性能。
内容总结
以上是互联网集市为您收集整理的Java中的锁 | Sychronized & Lock 的区别全部内容,希望文章能够帮你解决Java中的锁 | Sychronized & Lock 的区别所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。
来源:【匿名】