jvm对锁的优化

  jvm对锁(sychornized)的优化开始于jdk1.6。优化的方面主要技术包括:自旋锁、自适应自旋锁、偏向锁、锁销除、锁粗话,轻量级锁,重量级锁

  1自旋锁:在锁争用不多、锁占用时间比较少的情况下,自旋锁让线程去循环获取锁,这比线程阻塞性能更好(包括挂起或唤醒)。自旋锁默认自旋的次数是10次,可以通过JVM参数-XX:PreBlockSpin配置,

  2自适应自旋锁:自适应自旋锁是基于自旋锁的优化,自旋锁会让线程去不断循环尝试获取锁,但如果某一个线程获取到锁的时间特别长(比阻塞的性能都低)这时候自旋锁的效果就不行了,从而自适应自旋锁应运而生。自适应自旋锁在获取锁失败后,会根据前面获取同样的锁的线程获取锁的时间来判断等待的处理方式去进行锁等待。自适应自旋的次数由前一次在同一个锁上的自旋次数和锁的拥有者的状态来决定。如果前面线程成功获取锁并且正常运行,那么本次获取锁的可能性很大,所以自旋的次数相对多一些;如果前面线程很少成功获取锁,那么本次获取锁的概率也很小,就可能不执行自旋。

  3偏向锁:偏向锁是在没有锁竞争的时候产生的,换句话就是只会有一个线程去获取锁,一旦有线程来竞争锁,偏向锁就不存在了。它的目标是减少无竞争的情况下,减少轻量级锁带来的资源消耗。(轻量级锁每次获取都会有一次cas操作,偏向锁只有在初始化的受操作一次cas)

  4锁消除:锁消除是指虚拟机在分析不存在共享数据需要竞争获取的情况下(如:对象变量)会将锁去除,提升运行效率。

  5锁粗话:是指同一线程内会对同一个对象进行多次获取锁时,会将锁的范围扩大至第一此次获取锁的开始位置,到最后一次释放锁的位置。

  6轻量级锁:轻量级锁是针对重量级锁的一个相对的概念,它的目标是减少无实际竞争情况下,使用重量级锁产生的性能消耗。轻量级锁不会申请互斥量(避免了损耗),它仅仅是将对象头里的锁标志位改为00。轻量级锁在经过一定次数的获取后会升级为重量级锁。

 

 

  7重量级锁:内存锁一般在java中被抽象为监视器(monitor)锁,监视器锁一般直接对应的是操作系统的互斥量(mutex),这种锁的成本非常高,包括系统调用引起的内核态和用户态的切换以及线程阻塞唤醒,后来这种锁被称为重量级锁。

 

  对象头的MARK WOLD的内容:

 

   补充(对象的内容包含对象头、实例数据和对齐填充)

  

  注意:1锁膨胀(升级)的过程为:偏向锁->轻量级锁->重量级锁.  

     2自旋锁和自适应自旋锁是可以理解为判断锁膨胀过程中的手段。当有其他线程会竞争锁时(占用锁的时间比较短),会通过自选锁去获取锁,这时锁会变为轻量级锁,如果超过一定时间,会再次升级为重量级锁;如果通过自适应自旋锁判断获取锁的时间比较长就会直接将锁升级为重量级锁。

posted @ 2021-11-13 23:55  whltw  阅读(274)  评论(0)    收藏  举报