Lock vs Monitor

参考资料:
1:https://howtodoinjava.com/java/multi-threading/multithreading-difference-between-lock-and-monitor/
2:https://www.cnblogs.com/noteless/p/10394054.html
3:https://www.cnblogs.com/keeplearnning/p/7020287.html
4:https://wangxinchun.iteye.com/blog/2367654

java面试中比较常见的问题,笼统的说:lock是monitor更深层的实现方式。下面还是详细回忆下,昨日学习内容。

纠正:

  • lock为实现monitor提供了必要的支持

锁(lock):

锁是对象头里的一个逻辑结构,当线程持有该对象的锁时(synchronize关键字),其他线程若想访问该资源对象,则必须等待持有者线程释放锁。

纠正:

  • 在堆内存中,锁是对象头中的一种逻辑数据

补充:

  • JVM中每个对象都拥有一个锁(或互斥锁)
  • 任何程序都可以使用它,来对该对象多线程访问的协调。即:任何现场想访问该对象的实例变量,则必须持有该对象的锁(在锁内存区域设置一些值),所有其他想访问该对象的线程,必须等待持有锁的线程释放该对象的锁(改变标记)

注意:

  • java中,类对象、实例对象是不同的对象
// 锁的是ClassObjLock类对象
public void ClassObjLock() {
  public void classLock() {
    synchronized(getClass()) {
      dosomethings...
    }
  }
}
猜测:
以上代码,若某线程调用classLock方法,在执行完成该方法前(即未释放锁)
那么另一线程进行构造对象操作:new ClassObjLock() 是否会报错?
**猜测会报错**

// 锁的是ClassObjLock类的实例对象
public void InstanceObjLock() {
  public  void InstanceLock() {
    // this指向每个由该类构造的实例对象
    synchronized(this) {
      dosomethings...
    }
  }
}

java变量详解

监视器(monitor):

监视器是一个逻辑结构,可以比作是一个建筑物,建筑物里有一间特殊的房间,称为资源对象。线程进入房间获取资源前,需先进入建筑物,若资源对象被其他线程持有,那后续进入的线程,将在入口集(entry set)中等待。某线程在对资源对象处理完成后,将会释放对象,并退出监视器。

纠正:

  • 特殊房间只是一个实例对象,一般包含了需要并发访问的数据。同一时刻只能有一个线程访问该房间(独占)
  • 相关名词:
    1. 进入建筑物 -- 进入监视器 2. 尝试进入房间 -- 获取监视器 3. 占有房间 -- 持有监视器 3. 退出房间 -- 释放监视器 4. 退出建筑物 -- 退出监视器
  • 监视器有互斥合作两种模式(理解错误 !!!
  • 监视器使线程同时具有互斥合作的特点
    1. 互斥:使用Lock
      入口集排队 --> 获取锁,持有监视器 --> 释放锁,释放监视器 --> 退出监视器。在该模式下,不需要使用到等待集。
    2. 合作:使用等待集(wait-set),即等待某些条件变为真
      一个线程需要一些处于特定状态的数据,另一线程则负责将该数据置为该状态时,合作是非常重要的。如:消费者/生产者模式:读线程需要缓冲区非空状态时,才能从缓冲区中读取任何数据,若读线程发现缓冲区为空,则必须等待,写线程则负责写入数据。 也称:Wait and NotifySignal and Continue监视器,因为它(等待线程 疑问1)保留了监视器的所有权(不是持有锁! 疑问2),并在需要时继续执行监视区域(同步代码块);稍后,通知线程释放监视器,等待线程被唤醒去获取锁。

2019-07-20 8:37:00
疑问:

  1. 它指代什么?等待线程?理由是什么?
  2. 保留监视器的所有权,是指什么?持有锁吗?理由是什么?

注意:

  • 监视器是逻辑结构,也就说是一种模型,并不像Lock一样实实在在的存在于内存中
  • jvm中,每一个对象都有一个锁,同时也绑定了一个监视器,其中监视器用来协调多个线程访问同一对象的的执行顺序

2019-07-18 22:20:00
疑问:

  1. 等待集有什么用?里面的线程,如何退出?
    2019-07-20 10:08:00
    在互斥时,不需要等待集;在合作时,等待集一般通过java中的wait关键字实现。
    等待集的线程不存在退出说法,只有持有监视器的线程,才能数据状态不满足的情况下,进入等待集等待或直接退出监视器。参考资料3
image

监视器-合作模式

你可能感兴趣的:(Lock vs Monitor)