java Monitor对象监视器、对象头、mark word | 您所在的位置:网站首页 › monitor和detector的区别 › java Monitor对象监视器、对象头、mark word |
文章目录
Monitor监视器java对象头Monitor
Monitor监视器
每一个对象都有一个monitor与之关联,当且一个monitor被持有后,它将处于锁定状态。线程执行到monitorenter 指令时,将会尝试获取对象所对应的monitor的所有权,即尝试获得对象的锁。 java对象头这里重点关注对象头中的Mark Word。 MarkWord里默认数据是存储对象的HashCode等信息,但是在运行期间,Mark Word里存储的数据会随着锁标志位的变化而变化。 重量级锁也就是通常说synchronized的对象锁,锁标识位为10,其中指针指向的是monitor对象(也称为管程或监视器锁)的起始地址。 Monitormonitor在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 实验室设备网 版权所有 |