美文网首页
深入理解JAVA 虚拟机 (四)java 线程 ,线程安全 ,

深入理解JAVA 虚拟机 (四)java 线程 ,线程安全 ,

作者: Gxgeek | 来源:发表于2017-09-10 21:19 被阅读0次
    • 轻量级锁
      • 如果轻量级锁失败,表示存在竞争,升级为重量级锁(常规锁)
      • 在没有锁竞争的前提下,减少传统锁使用OS互斥量产生的性能损耗
      • 在竞争激烈时,轻量级锁会多做很多额外操作,导致性能下降

    轻量级锁能提升程序同步性能的依据是“对于绝大部分的锁,在整个同步周期内都是不存在竞争的”,这是一个经验数据。如果没有竞争,轻量级锁使用CAS操作避免了使用互斥量的开销,但如果存在锁竞争,除了互斥量的开销外,还额外发生了CAS操作,因此在有竞争的情况下,轻量级锁会比传统的重量级锁更慢。

    mark
    • 偏向锁
      • 目的是消除数据在无竞争情况下的同步原语,进一步提高程序的运行性能。如果说轻量级锁是在无竞争的情况下使用CAS操作去消除同步使用的互斥量,那偏向锁就是在无竞争的情况下把整个同步都消除掉,连CAS操作都不做了。
      • 偏向锁会偏向于第一个获得它的线程(Mark Word中的偏向线程ID信息),如果在接下来的执行过程中,该锁没有被其他的线程获取,则持有偏向锁的线程将永远不需要再进行同步。
    mark
    • 自旋锁
      • 当竞争存在时,如果线程可以很快获得锁,那么可以不在OS层挂起线程,让线程做几个空操作(自旋)
      • JDK1.6中-XX:+UseSpinning开启
      • JDK1.7中,去掉此参数,改为内置实现
      • 如果同步块很长,自旋失败,会降低系统性能
      • 如果同步块很短,自旋成功,节省线程挂起切换时间,提升系统性能

    偏向锁,轻量级锁,自旋锁总结

    • 不是Java语言层面的锁优化方法
    • 内置于JVM中的获取锁的优化方法和获取锁的步骤
    • 偏向锁可用会先尝试偏向锁
    • 轻量级锁可用会先尝试轻量级锁
    • 以上都失败,尝试自旋锁
    • 再失败,尝试普通锁,使用OS互斥量在操作系统层挂起

    优化锁

    • 减少锁持有时间
    mark
    • 减小锁粒度
      • 将大对象,拆成小对象,大大增加并行度,降低锁竞争
      • 偏向锁,轻量级锁成功率提高
      • ConcurrentHashMap
      • HashMap的同步实现
        • Collections.synchronizedMap(Map<K,V> m)
        • 返回SynchronizedMap对象
    mark
    • 减小锁粒度
    • 锁分离
      • 锁分离是减小锁粒度的一个特例。他依据应用程序的功能特点,将一个独占锁分成多个锁。一个典型的案例就是java.util.concurrent.LinkedBlockingQueue的实现。在LinkedBlockingQueue的实现中,take()函数和put()函数分别实现了从队列中取得数据和往队列中zeng增加数据的功能。虽然两个函数都对当前队列进行了修改操作,但由于LinkedBlockingQueue是基于链表的,因此,两个操作分别作用于队列的前端和尾端,从理论上来说,两者并不冲突。
    mark
    • 锁粗化
      • 通常情况下,为了保证多线程间的有效并发,会要求每个线程持有锁的时间尽量短,即在使用完公共资源后,应该立即释放锁。只有这样,等待在这个锁上的其他线程才能尽早的获得资源执行任务。但是,凡事都有一个度,如果对同一个锁不停的进行请求、同步和释放,其本身也会消耗系统宝贵的资源,反而不利于性能的优化


        mark
    • 锁消除

      • 不需要锁的地方就去掉。
    • 无锁

      • 锁是悲观的操作
      • 无锁是乐观的操作
      • 无锁的一种实现方式
      • CAS(Compare And Swap)
      • 非阻塞的同步
      • CAS(V,E,N)
      • 在应用层面判断多线程的干扰,如果有干扰,则通知线程重试
    mark
    CAS
    • CAS算法的过程是这样:它包含3个参数CAS(V,E,N)。V表示要更新的变量,E表示预期值,N表示新值。仅当V值=E值时,才会将V的值设为N,如果V值和E值不同,则说明已经有其他线程做了更新,则当前线程什么都不做。最后,CAS返回当前V的真实值。

    主要参考

    • 《深入理解Java虚拟机:JVM高级特性与最佳实践》

    相关文章

      网友评论

          本文标题:深入理解JAVA 虚拟机 (四)java 线程 ,线程安全 ,

          本文链接:https://www.haomeiwen.com/subject/tabtsxtx.html