美文网首页
java多线程锁的优化策略

java多线程锁的优化策略

作者: 过去今天和未来 | 来源:发表于2017-11-25 18:06 被阅读58次

锁优化的思路:

    1.减少锁的持有时间(对需要同步的几行代码进行加锁)

    2.减少锁的粒度 (ConcurrentHashMap采取对segment加锁而不是整个map加锁)

    3.锁分离(将锁划分为读锁和写锁,相互不互斥)

    4.锁粗化(一个间隔性地需要执行同步语句的线程中,如果在不连续的同步块间频繁加锁解锁是很耗性能的,因此把加锁范围扩大总体来说是优化的)

Java虚拟机采取的锁优化

      1.偏向锁:锁对象偏向于当前获得它的线程,如果在接下来没有其他线程请求,则持有锁的线程将不再进行同步操作。(持有该锁的线程在接下来执行中遇到同步代码块不需要lock和unlock)。当另一个线程申请该锁,当前线程的偏向模式结束,让出该锁

      2.轻量级锁:syncrhoized的底层实现是通过监视器monitor来控制的,而monitorenter与monitorexit这两个原语是依赖操作系统互斥(mutex)来实现的。互斥会导致线程挂起,并在较短时间内重新调度原程序,较消耗资源。轻量级锁利用CPUCAS指令,尝试进入互斥前进行补救,减少多线程进入互斥几率。如果偏向锁失败,那么系统进行轻量锁的操作,使用CAS操作尝试加锁。轻量锁失败才会调用系统级别的重量锁来加锁。

      3.自旋锁: 当线程申请锁时,锁被占用,则让当前线程执行一个忙循环(自旋),看看持有锁的线程是否会很快释放锁。如果自旋后还没获得锁,才进入同步阻塞状态;

     3.1自适应自旋:自旋的线程自旋的时间为同一个锁上一次线程自旋并获得锁的耗时。如果对于这个锁,自旋很少有成功的,就不自旋了,避免浪费CPU资源。为了尽量避免使用重量级锁(操作系统层面的互斥),JVM首先会尝试轻量级锁,轻量级锁会尝试使用CAS操作来获得锁,如果轻量级锁获得失败,说明存在竞争。但是也许很快就能获得锁,就会尝试自旋锁,将线程做几个空循环,每次循环时都不断尝试获得锁。如果自旋锁也失败,那么只能升级成重量级锁。

相关文章

  • java多线程锁的优化策略

    锁优化的思路: 1.减少锁的持有时间(对需要同步的几行代码进行加锁) 2.减少锁的粒度 (Concurre...

  • (转载)深入理解多线程(五)—— Java虚拟机的锁优化技术

    原文链接:深入理解多线程(五)—— Java虚拟机的锁优化技术-HollisChuang's Blog 本文是《深...

  • Java多线程--锁的优化

    Java多线程--锁的优化 提高锁的性能 减少锁的持有时间 一个线程如果持有锁太长时间,其他线程就必须等待相应的时...

  • Java 多线程锁优化

    Java并发编程一般都会用到锁,采用了阻塞形式的并发,而有时加锁后执行效率也应尽可能地得到最大提升。提供其性能,少...

  • 实战java高并发程序设计第四章-锁优化(一)

    前言:java 多线程锁的优化一直是难点!如果优化的好,性能会高很多,比如 jdk 里面提供了很多 juc 的类,...

  • Java多线程优化

    一、Java 系统内部锁优化 当使用 Java 多线程访问共享资源的时候,会出现竞态的现象。即随着时间的变化,多线...

  • iOS端sqlite3 的线程安全

    sqlite3 多线程和锁 ,优化插入速度及性能优化这篇博客,着重介绍了sqlite3 多线程和锁。这里针对iOS...

  • Java多线程编程——锁优化

    并发环境下进行编程时,需要使用锁机制来同步多线程间的操作,保证共享资源的互斥访问。加锁会带来性能上的损坏,似乎是众...

  • Java多线程编程 — 锁优化

    阅读目录 一、尽量不要锁住方法 二、缩小同步代码块,只锁数据 三、锁中尽量不要再包含锁 四、将锁私有化,在内部管理...

  • Java多线程编程 — 锁优化

    阅读目录 一、尽量不要锁住方法 二、缩小同步代码块,只锁数据 三、锁中尽量不要再包含锁 四、将锁私有化,在内部管理...

网友评论

      本文标题:java多线程锁的优化策略

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