synchronized 实现原理
synchronized 实现原理2020-03-24
synchronized 实现原理前言众所周知 synchronized 锁在 Java 中经常使用它的源码是 C++ 实现的,它的实现原理是怎样的呢?本文以 OpenJDK 8 为例探究以下内容。
synchronized 是如何工作的
synchronized 锁升级过程
重量级锁的队列之间协作过程和策略
对象头对象头的内容非常多这里我们只做简单介绍以引出后文。在 JVM 中对象布局分为三块区域:
对象头
实例数据
对齐填充
当线程访问同步块时首先需要获得锁并把相关信息存储在对象头中。所以 wait、notify、notifyAll 这些方法为什么被设计在 Object 中或许你已经找到答案了。
Hotspot 有两种对象头:
数组类型,使用 arrayOopDesc 来描述对象头
其它,使用 instanceOopDesc 来描述对象头
对象头由两部分组成
Mark Word:存储自身的运行时数据,例如 HashCode、GC 年龄、锁相关信息等内容。
Klass Pointer:类型指针指向它的类元数据的指针 ...
Java线程生命周期与状态切换
Java线程生命周期与状态切换
前提#最近有点懒散,没什么比较有深度的产出。刚好想重新研读一下JUC线程池的源码实现,在此之前先深入了解一下Java中的线程实现,包括线程的生命周期、状态切换以及线程的上下文切换等等。编写本文的时候,使用的JDK版本是11。
Java线程的实现#在JDK1.2之后,Java线程模型已经确定了基于操作系统原生线程模型实现。因此,目前或者今后的JDK版本中,操作系统支持怎么样的线程模型,在很大程度上决定了Java虚拟机的线程如何映射,这一点在不同的平台上没有办法达成一致,虚拟机规范中也未限定Java线程需要使用哪种线程模型来实现。线程模型只对线程的并发规模和操作成本产生影响,对于Java程序来说,这些差异是透明的。
对应Oracle Sun JDK或者说Oracle Sun JVM而言,它的Windows版本和Linux版本都是使用一对一的线程模型实现的(如下图所示)。
也就是一条Java线程就映射到一条轻量级进程(Light Weight Process)中,而一条轻量级线程又映射到一条内核线程(Kernel-Level Thread)。我们平时所说的线 ...