栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

synchronized原理之前置知识

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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的过程

 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/715961.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号