synchronized原理之前置知识

synchronized原理之前置知识,第1张

synchronized原理之前置知识 一、Monitor概述 一、Java 对象头以 32 位虚拟机为例 一、普通对象
|--------------------------------------------------------------|
| Object Header (64 bits) |
|------------------------------------|-------------------------|
| Mark Word (32 bits) | Klass Word (32 bits)(这个可以找到对象) |
|------------------------------------|-------------------------|
二、数组对象
|---------------------------------------------------------------------------------|
| Object Header (96 bits) |
|--------------------------------|-----------------------|------------------------|
| Mark Word(32bits) | Klass Word(32bits) | array length(32bits) (数组长度)|
|--------------------------------|-----------------------|------------------------|
三、其中 Mark Word 结构为

64 位虚拟机 Mark Word

 

二、Monitor(锁)

Monitor被翻译为监视器或管程

每个java对象都可以关联一个Monitor对象,如果使用synchronized给对象上锁(重量级)之后

 执行过程:

1、当一个线程进入加了synchronized关键字的代码块,或锁(锁的其实是对象)后,首先,obj这个对象的对象头中的MarkWord部分会有所改变

,这个改变就是会与系统提供的monitor对象相关联,关联成功mark word就会从无锁变为有锁状态。

2、之后Monitor对象里面的属性Owner就会记录这个线程,表示这个线程是这把锁的主人。

3、以后的线程再请求加锁的代码块时,就会先检查obj这个对象有没关联锁,一检查就会发现已经关联了一个锁,然后这个线程就会与Monitor的EntryList属性进行关联,线程变为阻塞状态。之后来的线程都会与这个属性关联。底层是链表结构。

4、当线程2执行完synchronized代码块之后, 就会释放里面的锁。线程1与线程3就会竞争,获得锁之后又会执行线程2的过程

 

 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5712606.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存