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 结构如下:
执行步骤:
- 刚开始Monitor 中Owner为null
- 当Thread-2执行synchronized(obj)就会将Monitor的所有者Owner置为Thread-2,Monitor中只能有一个Owner。
- 在Thread-2上锁的过程中,如果Thread-3,Thread-4,Thread-5也来执行synchronized(obj),就会进入EntryList(进入阻塞BLOCKED状态)
- Thread-2执行完同步代码块的内容,然后唤醒EntryList中等待的线程来竞争锁,竞争的时是非公平的(线程可以插队)
- 图中WaitSet中的Thread-0,Thread-1是之前获得过锁。
注意:
- synchronized 必须是进入同一个对象的monitor才有上述的效果
- 不加synchronized的对象不会关联监视器,不遵从以上规则
以上是关于JUC并发编程 -- Monitor 概念(Java 对象头 & synchronized原理之 Monitor(锁))的主要内容,如果未能解决你的问题,请参考以下文章