技术文章 > java >  java基础 > 正文

synchronized在java的优缺点

小妮浅浅

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

1.synchronize不足之处

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

1)效率低

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

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

2)不够灵活

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

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

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

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

2.synchronize锁的优缺点

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

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

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

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

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