java - ReentrantLock和Synchronized
问题描述
在资源竞争不是很激烈的情况下,Synchronized的性能要优于ReetrantLock,但是在资源竞争很激烈的情况下,Synchronized的性能会下降几十倍,但是ReetrantLock的性能能维持常态
(1)这个是为啥?(2)ReentrantLock是不是轻量级锁? 轻量级锁有哪些? 只听过这个名字,没见过有具体实现
用synchronized时候,如果程序运行出错,就会抛出异常,但是不会去做清理工作。使用ReentrantLock允许你尝试着获取但最终未获取的锁,这样如果其他人已经获得这个锁,那你就可以离开去执行别的事情(但是我现在想做的事情的是获取锁之后进行某些操作,现在转而去执行其他事情好像意义不太大呀),而不是等待直到这个锁被释放。
问题解答
回答1:首先你说的这个情况,是在java 1.5刚引入ReentrantLock的时候才有,java1.6对Synchronized的实现算法进行了改造,与ReentrantLock的实现基本一致,所以俩者的性能差异已经很小了。关于轻量级锁,这是java1.6引入的提升锁性能的一种方式,属于jvm层级的,不存在什么具体实现。如果希望等待直到这个锁被释放,可以使用Lock.lock()获得的方式获得锁,使用Lock.tryLock()才是在尝试获取可能获取不到锁。
回答2:可以简单一点的理解,synchronized 的读写页都是互斥的,但是 ReentrantLock 有读写锁,读锁可以共享,写锁才互斥,如果从这里看的话 ReentrantLock 在读多,写少的情况下性能会高不少,但是代码比 synchronized 的复杂,如果控制不好也容易出问题。
相关文章:
1. css3 - 这个效果用 CSS 可以实现吗?border-image2. android - webview 自定义加载进度条3. mac连接阿里云docker集群,已经卡了2天了,求问?4. Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?5. 如何解决Centos下Docker服务启动无响应,且输入docker命令无响应?6. position:absolute、float、display:inline-block 都能实现相同效果,区别是什么?7. angular.js - angular post的Content-Type被设置,导致不能上传图片,求助!!8. angular.js - Web应用,单页面应用Cache问题9. javascript - vue更改当前节点元素10. vue.js - vue 打包后 nginx 服务端API请求跨域问题无法解决。

网公网安备