首页 > 试题广场 >

在监视器(Monitor)内部,是如何做线程同步的?程序应该

[问答题]
请你说明一下在监视器(Monitor)内部,是如何做到线程同步的?在程序又应该做哪种级别的同步呢? 
这里的监视器应该是管程吧
管程用来解决线程间的互斥与同步两大问题
  1. 互斥,同一时间一个管程中只能运行一个线程,对应java中的synchronized关键字
  2. 同步,其实就是解决线程间如何协同工作的问题,对应java中的wait(),notify(),notifyAll()方法。
上面加粗的部分构成了java中管程的组件,我们要做的就是怎么使用它们以及注意哪些点
比如大家都这么用wait()方法:
while(条件不满足){
    wait();
}
为什么这里要用while循环。
这是因为对于notify之后,何时让出CPU的问题,java的设计者采用了MESA的设计模式。
这种模式的特点就是线程A因为某个条件满足(就是while循环里的条件)执行notify唤醒线程B,但A不会立即停止或阻塞自己以让出CPU,他还会继续运行,而被唤醒的线程B也只是变成了就绪态,并没有运行,只有等到A自然阻塞或跑完整个代码段或CPU调度使线程B得到时间片,线程B才能从上次自己阻塞的位置——紧邻wait()语句之后开始运行,这期间可能因为A的继续运行比如消耗了一些资源使条件变得又不满足了。
    在这种情况下对B的期望是不要运行,因为条件不满足嘛。有while循环的话,B进入循环后的第一件事就是进行新一轮的循环,直接执行wait,挂起自己。不用while或者使用if的时候B一定会跨过这道检验。
另外还有synchronized给谁加锁的问题,notify与notityAll用哪个的问题

个人理解,出错的地方还请各位大佬指正

发表于 2019-05-02 21:14:11 回复(0)
考察点:JAVA线程同步 参考回答: 监视器和锁在Java虚拟机中是一块使用的。监视器监视一块同步代码块,确保一次只有一个线程执行同步代码块。每一个监视器都和一个对象引用相关联。线程在获取锁之前不允许执行同步代码。
发表于 2019-05-01 21:35:52 回复(0)
监视器和锁在Java虚拟机中是一块使用的,监视器监视一块同步代码块,确保只有一个线程执行同步代码块,每一个监视器都和一个对象相关联,线程在获取锁之前不允许执行同步代码块。
发表于 2020-02-28 15:23:43 回复(0)