• 技术文章 >java >java基础

    synchronized在java的优缺点

    小妮浅浅小妮浅浅2021-01-09 13:49:58原创3861

    在使用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进行解决。

    专题推荐:java synchronized优缺点
    上一篇:synchronized在java中的原理分析 下一篇:java中对象头的用法

    相关文章推荐

    • synchronized在java中的修饰• synchronized在java中的原理分析

    全部评论我要评论

    © 2021 Python学习网 苏ICP备2021003149号-1

  • 取消发布评论
  • 

    Python学习网