美文网首页
锁状态的分析

锁状态的分析

作者: 散入风中 | 来源:发表于2018-03-05 10:48 被阅读0次

无锁状态-》偏向锁-》轻量级锁-》重量级锁-》锁膨胀

锁的状态总共有四种:无锁状态、偏向锁、轻量级锁和重量级锁。随着锁的竞争,锁可以从偏向锁升级到轻量级锁,再升级的重量级锁(但是锁的升级是单向的,也就是说只能从低到高升级,不会出现锁的降级)。JDK 1.6中默认是开启偏向锁和轻量级锁的,

锁膨胀:从轻量锁膨胀到重量级锁是在轻量级锁解锁过程发生的。

重量级锁:Synchronized是通过对象内部的一个叫做监视器锁(monitor)来实现的。但是监视器锁本质又是依赖于底层的操作系统的Mutex Lock来实现的。而操作系统实现线程之间的切换这就需要从用户态转换到核心态,这个成本非常高,状态之间的转换需要相对比较长的时间,这就是为什么Synchronized效率低的原因。因此,这种依赖于操作系统Mutex Lock所实现的锁我们称之为“重量级锁”。由于Synchronized在JDK1.6之后进行了大量优化,现在已经成为一个常驻得轻量级锁了。

轻量级锁:“轻量级”是相对于使用操作系统互斥量来实现的传统锁而言的。但是,首先需要强调一点的是,轻量级锁并不是用来代替重量级锁的,它的本意是在没有多线程竞争的前提下,减少传统的重量级锁使用产生的性能消耗。在解释轻量级锁的执行过程之前,先明白一点,轻量级锁所适应的场景是线程交替执行同步块的情况,如果存在同一时间访问同一锁的情况,就会导致轻量级锁膨胀为重量级锁。

偏向锁: 引入偏向锁是为了在无多线程竞争的情况下尽量减少不必要的轻量级锁执行路径,因为轻量级锁的获取及释放依赖多次CAS原子指令,而偏向锁只需要在置换ThreadID的时候依赖一次CAS原子指令(由于一旦出现多线程竞争的情况就必须撤销偏向锁,所以偏向锁的撤销操作的性能损耗必须小于节省下来的CAS原子指令的性能消耗)。上面说过,轻量级锁是为了在线程交替执行同步块时提高性能,而偏向锁则是在只有一个线程执行同步块时进一步提高性能。

无锁状态:在代码进入同步块的时候,如果同步对象锁状态为无锁状态。

相关文章

  • 锁状态的分析

    无锁状态-》偏向锁-》轻量级锁-》重量级锁-》锁膨胀 锁的状态总共有四种:无锁状态、偏向锁、轻量级锁和重量级锁。随...

  • Java并发编程-读写锁(ReentrantReadWriteL

    章节目录 ReentrantReadWriteLock 特性 读写锁接口示例 读写锁的实现分析读写状态设计写锁的释...

  • Synchronized(二)

    上集说到,Java的对象头里可以标记对象锁的状态:无锁,偏向锁,轻量级锁,重量级锁,我们进一步分析四种锁的状态 J...

  • AQS总结

    摘自一行一行源码分析清楚AbstractQueuedSynchronizer 公平锁的总结: 锁状态。我们要知道锁...

  • Synchronized总结

    线程状态分析图 Synchronized的两种用法 对象锁:包括方法锁(默认对象锁为this当前实例对象)和同步代...

  • 偏向锁、轻量级锁、重量级锁的升级以及区别

    今天来讲一下偏向锁、轻量级锁、重量级锁的升级以及区别。 锁的状态: 无锁状态 偏向锁状态 轻量级锁状态 重量级锁状...

  • Java锁详解

    锁的状态总共有四种:无锁状态、偏向锁状态、轻量级锁状态和重量级锁状态。这几个状态会随着竞争情况逐渐升级。为了提高获...

  • 状态与升级 锁一共有4种状态,级别从低到高依次是: 无锁状态、 偏向锁状态、 轻量级锁状态和 重量级锁状态。 这几...

  • 锁的四种状态

    锁的四种状态 Java锁的四种状态分别是无锁、偏向锁、轻量级锁、重量级锁。 为什么要有锁的四种状态 JDK 1.6...

  • Java中的锁的几种状态

    锁的状态分几种, 无锁状态--->偏向锁-->轻量级锁-->重量级锁 锁可以升级不能降级目的是:提高获取锁和释放...

网友评论

      本文标题:锁状态的分析

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