Monitor机制介绍(4)

x33g5p2x  于2021-08-23 转载在 Java  
字(1.0k)|赞(0)|评价(0)|浏览(381)

一 Monitor 引入

读过我并发编程专栏发布多线程synchronized权威解析一文的同学都知道,Synchronization 是围绕着内部被称为内部锁(intrinsic lock)或者监管锁(Monitor Lock)的实体建立的;那么我们看看Object的notify()方法源码中的一段介绍如下:其意指唤醒一个正在等待对象monitor的线程;如果有多线程在等待这个对象,只有其中的一个线程会被唤醒;而且这种选择是任意的,由实现者自行决定。一个线程等待对象的monitor是通过object的wait()方法调用。我们只知道每个对象都有一个唯一的monitor,那么什么是monitor呢?

Wakes up a single thread that is waiting on this object's monitor. If any threads are waiting on this object, one of them is chosen to be awakened. The choice is arbitrary and occurs at the discretion of the implementation. A thread waits on an object's monitor by calling one of the {@code wait} methods.

二 Lock 简介

要介绍monitor,我们先了解lock;lock是一种数据类型,堆内存中它是对象逻辑区的头部分;每一个对象在jvm中都有lock(或者mutex),任何程序都可以使用锁来协调多线程访问对象;任何一个线程想要进入一个对象的实体,都需要拥有这个对象的锁(即在内存区中设置lock的标志位flag);其他的线程若果尝试去获得锁,就会进入等待状态,直到拥有锁的线程释放锁(即取消设置标志位)

如果一个线程获得锁,那么其可以多次请求获得相同的锁,但是也必须释放相应次数的锁。

三 monitor

monitor是一种syncronized的构造,其允许线程相互之间排斥和协作;排斥同竞争锁,协作如生产和消费模式(wait,notify模式)。当一个线程进入monitor是有三个时期(如下图);

  1. 进入monitor,此时是被分配在entry set 中,等待lock的拥有者释放锁;
  2. 当线程获得lock就会成为lock的拥有者(仅有一个线程可以拥有),此时处于 the owner 区域;
  3. 当释放lock就会进入wait set ,但是处于wait set 中的线程还是有机会获得lock的拥有权。

monitor.png

相关文章

微信公众号

最新文章

更多