Monitor监视器

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

java对象头

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

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

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

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

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


Monitor

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

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

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

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

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

相关文章:

  • 2021-04-05
  • 2021-06-04
  • 2021-12-03
  • 2021-11-29
  • 2021-03-30
  • 2021-11-17
  • 2021-04-07
  • 2021-07-21
猜你喜欢
  • 2021-04-29
  • 2021-07-24
  • 2021-07-04
  • 2021-11-17
  • 2021-04-30
相关资源
相似解决方案