java Monitor对象监视器、对象头、mark word 您所在的位置:网站首页 monitor和detector的区别 java Monitor对象监视器、对象头、mark word

java Monitor对象监视器、对象头、mark word

2023-08-10 04:44| 来源: 网络整理| 查看: 265

文章目录 Monitor监视器java对象头Monitor

Monitor监视器

每一个对象都有一个monitor与之关联,当且一个monitor被持有后,它将处于锁定状态。线程执行到monitorenter 指令时,将会尝试获取对象所对应的monitor的所有权,即尝试获得对象的锁。

java对象头

在这里插入图片描述

这里重点关注对象头中的Mark Word。

MarkWord里默认数据是存储对象的HashCode等信息,但是在运行期间,Mark Word里存储的数据会随着锁标志位的变化而变化。

在这里插入图片描述

重量级锁也就是通常说synchronized的对象锁,锁标识位为10,其中指针指向的是monitor对象(也称为管程或监视器锁)的起始地址。

Monitor

monitor在JVM中是基于C++的实现的,ObjectMonitor中有几个关键属性:

_owner:指向持有ObjectMonitor对象的线程 _WaitSet:存放处于wait状态的线程队列 _EntryList:存放处于等待锁block状态的线程队列 _recursions:锁的重入次数 _count:用来记录该线程获取锁的次数

在这里插入图片描述

    当多个线程同时访问一段同步代码时,首先会进入_EntryList队列中,当某个线程获取到对象的monitor后进入_Owner区域并把monitor中的_owner变量设置为当前线程,同时monitor中的计数器_count加1。即获得锁。     若持有monitor的线程调用wait()方法,将释放当前持有的monitor,_owner变量恢复为null,_count自减1,同时该线程进入_WaitSet集合中等待被唤醒。     若当前线程执行完毕也将释放monitor(锁)并复位变量的值,以便其他线程进入获取monitor(锁)

notify 方法: 从等待队列中唤醒任意一个线程,使该线程退出等待队列,进入可运行状态,也就是notify()方法仅通知一个线程。 notifyAll 方法: 使所有正在等待队列中线程退出等待队列,进入就绪状态。 wait 方法: 阻塞



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有