美文网首页
Java 锁总结 (未完待续)

Java 锁总结 (未完待续)

作者: 兴厚 | 来源:发表于2020-04-07 21:10 被阅读0次

本文持续更新,目前 JDK版本为 8

HotSpot 基础信息(x86 64位)

  1. 对象结构 (参考资料: https://weekly-geekly.github.io/articles/447848/index.html

    在 Hotspot 中一个对象由四部分数据组成。

    ① mark word (对象加锁后状态的变化就表现在这里面,下面的结构不确定)

    1. identity_hashcode 值 31bit
    2. GC 分代年龄 4 bit
    3. biased_lock 1bit lock 2bit

    ② class pointer (类型指针)

    1. 指向类的metadata

    ③ 实例数据

    ④ padding (位填充,使得对象的大小为8 byte的倍数)

    ​ 1. 按8字节对齐

    数组有一个额外的32bit 来描述它的长度信息,下面引用自 Hotspot jdk8源码 markOop.hpp

//  32 bits:
//  --------
//             hash:25 ------------>| age:4    biased_lock:1 lock:2 (normal object)
//             JavaThread*:23 epoch:2 age:4    biased_lock:1 lock:2 (biased object)
//             size:32 ------------------------------------------>| (CMS free block)
//             PromotedObject*:29 ---------->| promo_bits:3 ----->| (CMS promoted object)
//
//  64 bits:
//  --------
//  unused:25 hash:31 -->| unused:1   age:4    biased_lock:1 lock:2 (normal object)
//  JavaThread*:54 epoch:2 unused:1   age:4    biased_lock:1 lock:2 (biased object)
//  PromotedObject*:61 --------------------->| promo_bits:3 ----->| (CMS promoted object)
//  size:64 ----------------------------------------------------->| (CMS free block)

锁基础信息

  1. 锁分类

    1. 无锁,表现在对象的 markword 标记位的后三位,最后两位锁标志位为 01,倒数第三位偏向锁位为0
    2. 偏向锁,只偏向于某个线程的锁即为偏向锁。 最后两位锁标志位为 01,倒数第三位偏向锁位为0。 当有2个线程及以上竞争时就会升级为轻量锁。在 Hotspot 中为默认开启(UseBiasedLocking)。但会有4秒延迟(BiasedLockingStartupDelay).
    3. 轻量锁, 大于两个线程小于系统cpu核数/2的线程数竞争会处在这个阶段,cas 实现,锁标志位 00
    4. 重量锁,会调用 os 的锁机制来实现,所以效率比较低下,锁标志位 10
  2. 锁升级过程

    ​ Hotspot启动默认开启了偏向锁开关,虽然偏向锁只对单个线程有用,看起来和无锁差不多,但是由于jvm的实现大部分都包含有同步的方法,在日常使用过程中,这些方法只会被同一个线程使用,就不需要重量级锁的实现了,所以加了这个偏向锁。默认开启了4秒延迟。这是由于应用场景的约束,

Synchronized

使用方法: 锁住这个对象的指定代码块,同一时间只能有一个线程执行这个代码块中的方法。这并不意味这同时只能有一个线程进入这个代码块,而是执行这个代码块的方法。

// DCL 经典代码, 和 volatile 配合使用更安全(静止指令重排序)
example-1:
if (multiDemo == null) {
    synchronized (MultiDemo.class) {
        if (multiDemo == null) {  // 如果不加这个判断,实现不了单例。
            multiDemo = new MultiDemo();
        }
    }
}
example-2:

代码分析:

相关文章

  • Java 锁总结 (未完待续)

    本文持续更新,目前 JDK版本为 8 HotSpot 基础信息(x86 64位) 对象结构 (参考资料: http...

  • Java中的锁

    对Java中的锁做了简单的罗列总结,以便于后期回顾。 本文对如下概念进行了总结:锁的意义;锁的定义与实现;Java...

  • Android面试知识点(三)*

    1、java里的锁总结(synchronized隐式锁、Lock显式锁、volatile、CAS)[https:/...

  • 分布式锁

    前面小结过java锁,这次在来总结下分布式锁 Java锁如下 分布式锁方案 基于数据库 基于Redis 基于Zoo...

  • J.U.C|一文搞定Java锁体系

    在介绍具体锁之前,我们来总结下Java中到底有哪些锁,这篇作为系列文章的开篇,我们主要来搞清楚Java锁的体系架构...

  • Java 中的各种锁

    多线程开发离不开各种锁,下面总结下Java和JDK提供的各种锁机制 synchronized synchroniz...

  • 乐观锁和悲观锁

    简单总结:悲观锁是线程访问的时候锁住直接锁住访问数据,java里面的synchronized就是一种悲观锁。乐观锁...

  • Java虚拟机总结给面试的你(下)

    本篇博客主要针对Java虚拟机的晚期编译优化,Java内存模型与线程,线程安全与锁优化进行总结,其余部分总结请点击...

  • Java锁全总结

    一个Java对象到底包含什么呢? 概括起来分为对象头、对象体和对齐字节。 对象的几个部分的作用: 1.对象头中的M...

  • Java中的锁

    这是一篇关于java锁的总结的开端,后续会单独对部分锁的原理进行展开。内容大多来自《深入理解Java虚拟机》、《J...

网友评论

      本文标题:Java 锁总结 (未完待续)

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