标签:Monitor Thread 对象 线程 Owner 原理 唤醒
目录
一.java对象头
二.Monitor原理
一.java对象头
64
位虚拟机
Mark Word:
Normal:无锁状态
Biased:偏向锁状态
Lightweight Locked:轻量级锁
Heavyweight Locked:重量级锁
Marked for GC:标记为GC
二.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 是之前获得过锁,但Owner
线程发现条件不满足,调用
wait
方法进入 WAITING 状态的线程。
(6)BLOCKED
和
WAITING
的线程都处于阻塞状态,不占用
CPU
时间片 BLOCKED 线程会在
Owner
线程释放锁时唤醒。WAITING 线程会在
Owner
线程调用
notify
或
notifyAll
时唤醒,但唤醒后并不意味者立刻获得锁,仍需进入 EntryList 重新竞争
标签:Monitor,
Thread,
对象,
线程,
Owner,
原理,
唤醒
From: https://blog.csdn.net/YouPromise/article/details/143699565