专栏首页Java患者多线程--锁的升级

多线程--锁的升级

锁的存储

在多线程并发编程中,synchronized一般我们认为是重量级锁,但是随着JDK1.6的优化之后,在一些情况下它就不显得那么重量级了,因为在JDK1.6中为了减少获得锁和释放锁带来的性能消耗而引入了偏向锁跟轻量级锁。

synchronized有三种方式加锁,修饰实例方法、修饰静态方法、修饰代码块。那么锁是如何存储的呢?

synchronized(lock)是基于lock这个对象的生命周期来控制锁的粒度的,那么锁的存储就应该和lock这个对象有关。

在虚拟机中可以了解到对象在内存中的布局可以非为三部分:对象头、实例数据、对齐填充。

对象头就记录了对象和锁的有关信息,当某个对象被synchronized关键字当成同步锁时,那么该对象的对象头就会存在锁的标志。

自己细品。。。。。

偏向锁

如何理解偏向锁呢,当一个线程访问加了锁的代码块时,会在对象头存储当前的线程ID,后续这个线程进入和退出这段代码的时候,不需要再次加锁和释放锁。而是直接比较对象头里面是否存储了当前线程的偏向锁。如果相等则表示偏向锁时偏向于该线程的,不需要再尝试获得锁。

其实就是偏向于第一个访问锁的线程,如果在运行过程中,同步锁只有一个线程访问,不存在多线程争用的情况,则线程是不需要触发同步的,这种情况下,就会给线程加一个偏向锁。 如果在运行过程中,遇到了其他线程抢占锁,则持有偏向锁的线程会被挂起,JVM会消除它身上的偏向锁,将锁恢复到标准的轻量级锁。这里其实就是一种锁的升级,毕竟synchronized锁了代码是因为防止多个线程并发的时候对数据造成不安全,但是如果只有线程访问,那synchronized就太消耗性能了,所以做了偏向锁进行升级。。

轻量级锁

当偏向锁已经不足够使用的时候,会再次升级为轻量级锁,偏向锁运行在一个线程进入同步块的情况下,当第二个线程加入锁争用的时候,偏向锁就会升级为轻量级锁。

轻量级锁再加锁过程中,会使用到了自旋锁,而自旋锁就是指当有另外一个线程来竞争锁时,这个线程会在原地循环等待,而不是阻塞该线程,直到前面的线程释放锁了之后,这个线程就可以马上获得锁。所以轻量级锁适用于同步代码块执行很快的场景,这样线程原地等待的时间很短就可以获取到锁。

本文分享自微信公众号 - Java患者(gh_3a16ffdedb6a),作者:Zero

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-07-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Synchronized锁性能优化偏向锁轻量级锁升级 多线程中篇(五)

    不止一次的提到过,synchronized是Java内置的机制,是JVM层面的,而Lock则是接口,是JDK层面的

    noteless
  • 多线程基础(五):java对象的MarkWord及synchronized锁升级过程

    在前面聊过了如何使用synchronized,以及synchronized不同的加锁方式分别锁的是哪些对象。本文对synchronized底层的原理进行深层次的...

    冬天里的懒猫
  • synchronized 锁的升级过程

    付威
  • java架构之路(多线程)synchronized详解以及锁的膨胀升级过程

      上几次博客,我们把volatile基本都说完了,剩下的还有我们的synchronized,还有我们的AQS,这次博客我来说一下synchronized的使用...

    小菜的不能再菜
  • synchronized的锁升级、锁膨胀

    即第一个拿到锁的线程,锁会在对象头 Mark Word 中通过 CAS 记录该线程 ID,该线程以后每次拿锁时都不需要进行 CAS(指轻量级锁)。

    java乐园
  • 多线程方向的锁

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    suveng
  • Python多线程编程,线程锁

    多线程threading 模块创建线程创建自己的线程类线程通信线程同步互斥方法线程锁@需要了解!!!

    py3study
  • 008.多线程-synchronized锁

    为了解决线程安全问题, 我们的做法是:不要让多个线程同时对一个全局变量作写的操作。

    qubianzhong
  • 011.多线程-lock锁

    类似于上一篇使用synchronized实现生产者与消费者间的通信, 这里使用lock锁来实现。

    qubianzhong
  • C++多线程-C++锁

    编写程序不容易,编写多线程的程序更不容易。相信编写过多线程的程序都应该有这样的一个痛苦过程,什么样的情况呢?朋友们应该看一下代码就明白了,

    cwl_java
  • C++多线程-windows锁

    在windows系统中,系统本身为我们提供了很多锁。通过这些锁的使用,一方面可以加强我们对锁的认识,另外一方面可以提高代码的性能和健壮性。常用的锁以下四种:临界...

    cwl_java
  • C++多线程-死锁

    相信有过多线程编程经验的朋友,都吃过死锁的苦。除非你不使用多线程,否则死锁的可能性会一直存在。为什么会出现死锁呢?我想原因主要有下面几个方面: (1)个人使用...

    cwl_java
  • MySQL innoDB 中的锁升级

    innoDB 引擎不存在锁升级的问题,因为其不是根据每个记录来产生啊行锁的,是根据每个事务访问的每个页对锁进行管理的。

    居士
  • 多线程五 锁的膨胀过程

    上一篇中,涉及到了锁升级的过程,也对其锁的升级有了一个大概的了解:单线程持有,在jvm延迟偏向的时间内是轻量级锁,之后为偏向锁,出现多个线程交替执行,对...

    sleeping
  • 浅析多线程的对象锁和Class锁

    一、前言 本来想在另外一篇文章说的,发现可能篇幅有点大,所以还是另开一篇博文来说好了。知识参考《Java多线程编程核心技术》,评价下这本书吧——大量的代码,简单...

    JMCui
  • 多线程--同步与锁

    贾博岩
  • C# 多线程锁之ReaderWriterLockSlim

    .NET 3.5 开始 ReaderWriterLockSlim登上舞台,ReaderWriterLockSlim 可以看做是 ReaderWriterLock...

    郑小超.
  • Java---多线程之死锁

    大家可能平时玩电脑,可以同时挂QQ啊,玩游戏啊,打开文本啊,等等。这里,我们假设是单块cpu。也就是俗称的单核cpu。 大家可能会觉得这些软件,这些线程是同...

    谙忆
  • C++多线程-顺序锁

    在互斥数据访问中有一种多读少写的情况。正对这么一种情形,我们也提出了读写锁的方案。但是呢,这个锁有些缺陷。什么缺陷呢?那就是,这个写锁需要在所有的读锁完成之后才...

    cwl_java

扫码关注云+社区

领取腾讯云代金券