JUC并发编程 -- Monitor 概念(Java 对象头 & synchronized原理之 Monitor(锁))

Posted Z && Y

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JUC并发编程 -- Monitor 概念(Java 对象头 & synchronized原理之 Monitor(锁))相关的知识,希望对你有一定的参考价值。

1. Java 对象头

在Java中,一个对象由对象头和对象体(成员变量)组成
以 32 位虚拟机为例:

普通对象:

数组对象:

其中 Mark Word 结构为:

举例:

  • 对于int来说,int占4个字节。

  • 对于Integer来说:

    • 一个Integer对象在内存中占了: 8字节(对象头) + 4字节(int) = 12字节
  • 所以在32 位虚拟机中一个Integer类型是int大小的3倍

  • 所以一般情况下,使用int就足够了。


2. synchronized原理之 Monitor(锁)

  • Monitor被翻译为监视器或管程
  • 每个Java对象都可以关联一个Monitor对象,如果使用synchronized给对象上锁(重量级)之后,该对象头的 Mark Word 中就被设置指向Monitor对象的指针。

Monitor 结构如下:

执行步骤:

  1. 刚开始Monitor 中Owner为null
  2. 当Thread-2执行synchronized(obj)就会将Monitor的所有者Owner置为Thread-2,Monitor中只能有一个Owner。
  3. 在Thread-2上锁的过程中,如果Thread-3,Thread-4,Thread-5也来执行synchronized(obj),就会进入EntryList(进入阻塞BLOCKED状态)
  4. Thread-2执行完同步代码块的内容,然后唤醒EntryList中等待的线程来竞争锁,竞争的时是非公平的(线程可以插队)
  5. 图中WaitSet中的Thread-0,Thread-1是之前获得过锁。

注意:

  • synchronized 必须是进入同一个对象的monitor才有上述的效果
  • 不加synchronized的对象不会关联监视器,不遵从以上规则


以上是关于JUC并发编程 -- Monitor 概念(Java 对象头 & synchronized原理之 Monitor(锁))的主要内容,如果未能解决你的问题,请参考以下文章

Java并发编程系列之三JUC概述

尚硅谷JUC高并发编程学习笔记

尚硅谷JUC高并发编程学习笔记

尚硅谷JUC高并发编程学习笔记

Java并发编程系列之三JUC概述

JUC并发编程 -- 同步 & 异步的应用