`

偏向锁 / 轻量级锁 / 重量级锁

    博客分类:
  • Lock
阅读更多

原创转载请注明出处:https://agilestyle.iteye.com/blog/2443647

 

锁的状态

  1. 无锁状态
  2. 偏向锁状态
  3. 轻量级锁状态
  4. 重量级锁状态

锁的状态是通过对象监视器在对象头中的字段来表明的。

为了提升性能,JDK1.6引入了偏向锁、轻量级锁、重量级锁概念,来减少锁竞争带来的上下文切换,而正是新增的Java对象头实现了锁升级功能。

当Java对象呗Synchronized关键字修饰成同步锁后,围绕这个锁的一系列升级操作都将和Java对象头有关。

 

Java对象头

在JDK1.6的JVM中,对象实例在堆内存中被分为了三个部分:对象头、实例数据、对齐填充。其中对象头由Mark Word、指向类的指针以及数组长度三部分组成。

Mark Word记录了对象和锁有关的信息。Mark Word在64位JVM中的长度是64bit,在64位JVM的存储结构如下图所示


锁升级主要依赖于Mark Word中的锁标志位和释放偏向锁标志位,Synchronized同步锁就是从偏向锁开始的,四种状态会随着竞争的情况逐渐升级到轻量级锁,最终升级到重量级锁,而且是不可逆的过程,即不可降级。

这四种状态都不是Java语言中的锁,而是JVM在使用synchronized时为了提高锁的获取与释放效率而做的优。

 

偏向锁

偏向锁是指一段同步代码一直被一个线程所访问,那么该线程会自动获取锁。降低获取锁的代价。

偏向锁主要用来优化同一个线程多次申请同一个锁的竞争,在某些情况下,大部分时间是同一个线程竞争锁资源。一旦出现其他线程竞争资源时,偏向锁就会被撤销。偏向锁的撤销需要等待全局安全点,暂停持有该锁的线程,同时检查该线程是否还在执行该方法,如果是,则升级锁,反之则被其他线程抢占。

因此在高并发场景下,当大量线程同时竞争同一个锁资源时,偏向锁就会被撤销,发生STW后,开启偏向锁会带来更大的性能开销,这时可以通过添加JVM参数关闭偏向锁来调优系统性能。

-XX:-UseBiasedLocking // 关闭偏向锁(默认打开)

 或

-XX:+UseHeavyMonitors  // 设置重量级锁

 

轻量级锁

轻量级锁是指当锁是偏向锁的时候,被另一个线程所访问,偏向锁就会升级为轻量级锁,其他线程会通过自旋的形式尝试获取锁,不会阻塞,提高性能。

轻量级锁适用于线程交替执行同步块的场景,绝大部分的锁在整个同步周期内都不存在长时间的竞争。

 

重量级锁

重量级锁是指当锁为轻量级锁的时候,另一个线程虽然是自旋,但自旋不会一直持续下去,当自旋一定次数的时候,还没有获取到锁,就会进入阻塞,该锁膨胀为重量级锁。重量级锁会让其他申请的线程进入阻塞,性能降低。

具体指轻量级锁CAS抢锁失败,线程将会被挂起进入阻塞状态。如果正在持有锁的线程在很短的时间内释放资源,那么进入阻塞状态的线程无疑又要申请锁资源。

JVM提供了一种自旋锁,可以通过自旋方式不断尝试获取锁,从而避免线程被挂起阻塞。这是基于大多数情况下,线程持有锁的时间都不会太长,毕竟线程被挂起阻塞可能会得不偿失。

JDK1.7开始,自旋锁默认启用,自旋次数由JVM设置决定,通常不建议设置的JVM重试次数过多,因为CAS重试操作意味着长时间地占用CPU。

自旋锁重试之后如果抢锁依然失败,同步锁就会升级至重量级锁。

在锁竞争不激烈且锁占用时间非常短的场景下,自旋锁可以提高系统性能。一旦锁竞争激烈或锁占用的时间过长,自旋锁将会导致大量的线程一直处于CAS重试状态,占用CPU资源,反而会增加系统性能开销。所以自旋锁和重量级锁的使用都要结合实际场景。

在高负载、高并发的场景下,可以通过设置JVM参数来关闭自旋锁,优化系统性能。

-XX:-UseSpinning // 参数关闭自旋锁优化 (默认打开) 
-XX:PreBlockSpin // 参数修改默认的自旋次数。JDK1.7 后,去掉此参数,由 jvm 控制

 

Reference

https://time.geekbang.org/column/article/101244

 

  • 大小: 77.5 KB
分享到:
评论

相关推荐

    偏向锁-轻量级锁-重量级锁

    NULL 博文链接:https://eleopard.iteye.com/blog/1746671

    一文读懂原子操作、内存屏障、锁(偏向锁、轻量级锁、重量级锁、自旋锁)、Disruptor、Go Context之上半部分.doc

    一文读懂原子操作、内存屏障、锁(偏向锁、轻量级锁、重量级锁、自旋锁)、Disruptor、Go Context之上半部分.doc

    java 偏向锁、轻量级锁及重量级锁synchronized原理.docx

    由于对象头的信息是与对象自身定义的数据没有关系的额外存储成本,因此考虑到JVM的空间效率,Mark Word 被设计成为一个非固定的数据结构,以便存储更多有效的数据,它会根据对象本身的状态复用自己的存储空间,如32...

    Java锁的升级策略 偏向锁 轻量级锁 重量级锁

    在本文中小编给的大家整理了关于Java锁的升级策略 偏向锁 轻量级锁 重量级锁的相关知识点内容,需要的朋友们参考下。

    Java轻量级锁(自旋锁)和偏向锁原理

    很多人都会称呼它为重量级锁,但是随着Java SE1.6对Synchronized进行了各种优化之后,有些情况下它并不那么重了,本文详细介绍了Java SE1.6中为了减少获得锁和释放锁带来的性能消耗而引入的偏向锁和轻量级锁,...

    百度地图毕业设计源码-interview-guide:面试指南

    偏向锁/轻量级锁/重量级锁的原理 ReentractLock synchronized与ReentractLock区别 volatile 线程池原理和参数配置 内存的多级缓存机 CAS 容器 HashMap 1.7和1.8的区别,resize过程,多线程的问题 ConcurrentHashMap ...

    理解原子操作,CAS加锁是线程安全的.docx

    偏向锁、轻量级锁和重量级锁不同的地方在于不是通过信号量机制(强制阻塞)而是通过自旋CAS实现互斥访问的,避免了强制阻塞时用户态与核心态之间切换带来的开销(系统调用),这里的开销主要是保存用户态的上下文...

    MarkWord 锁标记1

    锁状态(是否偏向锁)(锁标志位)无锁对象 hashCode对象分代年龄偏向锁对象分代年龄轻量级锁指向栈中锁记录的指针重量级锁指向重量级锁的指针GC 标记锁状态优

    Synchronized_思维导图(全面).xmind.zip

    从思维导图的角度将 Java 关键字 Synchronized进行分析整理,含盖CAS、偏向锁、轻量级锁、重量级锁及锁升级,同时附加了常见问题整理

    手写synchronized

    使用java模拟synchronzed的过程,模拟从无锁->偏向锁->轻量级锁->重量级锁->挂起->唤醒->继续抢锁,再模拟了各阶段的锁释放。(此代码不能运行,因为很多c++中的机制在java中不能实现)此代码仅用于学习synchronized的...

    通过内存布局带你掌握锁升级过程

    所以为了在一定程度上减少获得锁和释放锁带来的性能消耗,在 jdk6 之后便引入了“偏向锁”和“轻量级锁”,所以总共有4种锁状态,级别由低到高依次为:无锁状态、偏向锁状态、轻量级锁状态、重量级锁状态。...

    java8源码-concurrency:java并发总结

    偏向锁、轻量级锁、重量级锁 1.10 锁的公平性 1.11 线程组 2 多线程基本实现 2.1 多线程实现 Interface Runnable Callable Future ExecutorService Class Thread FutureTask FutureTask 获取线程执行结果的原理:以 ...

    word源码java-sync:同步

    公平锁、非公平锁、读写锁、共享锁、互斥锁、自旋锁、偏向锁、轻量级锁、重量级锁 锁什么?锁代码块还是锁对象? 上锁就是改变对象的对象头 对象头是所有对象开头的公共部分。 对象头由两个词组成。 第一个词是Mark...

    涵盖了90%以上的面试题

    轻量级锁 自旋锁 自适应自旋锁 重量级锁 synchronized 可重入锁 土方法实现可重入锁 使用AQS类实现可重入锁 CAS MySQL 中的行级锁、表级锁和页级锁 java中的死锁 公平锁和非公平锁 锁的总结 锁的优化 .......... ...

    Java-Web:整理一套java web知识体系,从java入门到框架应用等

    锁包括重量级锁、自旋锁、轻量级锁、偏向锁、悲观、乐观锁等各种锁,这里逐个进行介绍。 线程的方方面面。 zookeeper zookeeper主要功能包括:配置维护、域名服务、分布式同步、集群管理。 webservice 编写一个代码...

    Java 并发编程学习笔记之Synchronized底层优化

    主要介绍了Java 并发编程学习笔记之Synchronized底层优化的相关资料,主要包含了重量级锁,轻量级锁,偏向锁和其他优化等方面,有需要的小伙伴可以参考下

    java核心知识点整理.pdf

    1. 目录 1. 2. 目录 .........................................................................................................................................................1 JVM .........................

    JAVA核心知识点整理(有效)

    1. 目录 1. 2. 目录 .........................................................................................................................................................1 JVM ........................

Global site tag (gtag.js) - Google Analytics