synchronized在java的优缺点

synchronized在java的优缺点,第1张

synchronized在java的优缺点

在使用synchronized时,可以修饰方法,又可以结合锁进行一些 *** 作。当然这也会带来一些不足之处。为了能弥足这种缺陷,在synchronized锁的状态上又分为三种情况。本篇我们就synchronize不足之处进行讨论,然后针对这种情况,给出不同synchronize锁使用优缺点的应对方法。

1.synchronize不足之处

synchronized关键字既有优点也有缺点,而且缺点贼多,所以后来出现了比他更好的锁。下面我们就来分析一下,这也是面试常问问题。

(1)效率低

synchronized关键字是不可中断的,这也就意味着一个等待的线程如果不能获取到锁将会一直等待,而不能再去做其他的事了。

对synchronized关键字的一个改进措施,那就是设置超时时间,如果一个线程长时间拿不到锁,就可以去做其他事情了。

(2)不够灵活

加锁和解锁的时候,每个锁只能有一个对象处理,这对于目前分布式等思想格格不入。

(3)无法知道是否成功获取到锁

锁如果获取到了,我们无法得知。既然无法得知也就很不容易进行改进。

既然synchronized有这么多缺陷。所以才出现了各种各样的锁。

2.synchronize锁的优缺点

各种锁并不是相互代替的,而是在不同场景下的不同选择,绝对不是说重量级锁就是不合适的。每种锁是只能升级,不能降级,即由偏向锁->轻量级锁->重量级锁,而这个过程就是开销逐渐加大的过程。

(1)如果是单线程使用,那偏向锁毫无疑问代价最小,并且它就能解决问题,连CAS都不用做,仅仅在内存中比较下对象头就可以了;

(2)如果出现了其他线程竞争,则偏向锁就会升级为轻量级锁;

(3)如果其他线程通过一定次数的CAS尝试没有成功,则进入重量级锁;

在第3种情况下进入同步代码块就 要做偏向锁建立、偏向锁撤销、轻量级锁建立、升级到重量级锁,最终还是得靠重量级锁来解决问题,那这样的代价就比直接用重量级锁要大不少了。在绝大多数的情况下,偏向锁是有效的。

以上就是synchronized在java的优缺点分析,相信大家在使用synchronized会注意它的使用缺陷,容易寻找合适的synchronized进行解决。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/3017610.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-09-28
下一篇 2022-09-28

发表评论

登录后才能评论

评论列表(0条)

保存