管程

作者: zhengqiuliu | 来源:发表于2019-07-17 09:19 被阅读0次

管程:指的是管理共享变量以及对共享变量的操作过程,让他们支持并发。

Java在1.5之前仅仅提供了synchronized关键字及wait(),notify(),notifyAll()这三个方法。而操作系统原理介绍信号量能解决所有并发问题,结果我发现不是。Java采用管程技术,synchronized,wait,notify,notifyAll做为管程的组成部分。管程和信号量是等价的,所谓等价就是用信号量能够解决的问题,用管程也能够解决。

并发编程领域,有两大核心问题:一个是互斥,即同一时刻只允许一个线程访问共享资源;另一个是同步,即线程之间如何通信,协作。

管程模型里,共享变量和对共享变量的操作都是被封装起来的。在管程的发展史上,先后出现过三种不同的管程模型:Hasen模型,Hoare模型,MESA模型。Java管程实现参考的是MESA模型。如下图所示:

最外层的框就代表封装的意思。当多个线程同时试图进入管程内部时,只允许一个线程进入,其它线程则在入口等待队列中等待。

管程里还引入了条件变量的概念,而且每个条件变量都对应一个等待队列。

那条件变量和等待队列的作用?

Hasen模型,Hoare模型,MESA模型一个核心区别就是当条件变量满足后,如何通知相关线程。管程要求同一时刻只允许一个线程执行,那当线程T2的操作使线程T1等待条件满足时,T1和T2究竟谁可以执行呢?

Hasen模型:要求notify放在代码的最后,这样T2通知完后,T2就结束了,然后T1再执行,这样就保证了同一个时刻只有一个线程执行。

Hoare模型:T2通过完T1后,T2阻塞,T1马上执行;等T1执行完,再唤醒T2,也能保证同一个时刻只有一个线程执行。相比Hasen模型,T2多了一次阻塞唤醒操作。

MESA模型:T2通知完T1后,T2还是会接着执行,T1并不立即执行,仅仅是从条件变量的等待队列进到入口等待队列里面。这样做的好处:notify不需要放到代码最后,T2也没有多余的阻塞唤醒操作。坏处:就是当T1再次执行的时候,可能曾经满足的条件,现在已经不满足了,所以需要以循环方式检验条件变量。

相关文章

  • Monitors

    monitor Condition variable 管程 管程的定义管程是对共享数据的访问进行控制的特殊的一段程...

  • Java并发之嵌套管程锁死(Nested Monitor Loc

    嵌套管程死锁是如何发生的 具体的嵌套管程死锁的例子 嵌套管程死锁 vs 死锁 嵌套管程锁死类似于死锁, 下面是一个...

  • 管程

    管程 信号量机制存在的问题 编写困难,容易出错 管程 定义 特殊的软件模块 组成 局部于管程的共享数据结构说明 对...

  • 管程

    管程:指的是管理共享变量以及对共享变量的操作过程,让他们支持并发。 Java在1.5之前仅仅提供了synchron...

  • 管程

    管程,指的是管理共享变量以及对共享变量的操作过程,让他们支持并发。翻译为 Java 领域的语言,就是管理类的成员变...

  • 管程概念

    什么是管程 Java采用的是管程技术,synchronized关键字及wait()、notify()、notify...

  • Condition

    Condition 实现管程里面的条件变量 Lock和Condition实现的管程,线程等待和通知需要调用awai...

  • Java 中的 Monitor 机制

    monitor的概念 管程,英文是 Monitor,也常被翻译为“监视器”,monitor 不管是翻译为“管程”还...

  • 5.3 管程

    管程概述 虽然信号量是一种既方便、又有效的进程同步机制,但每个进程都要访问wait和signal操作,使得大量同步...

  • Java管程

    管程主要为了解决并发领域的两大核心问题:互斥和同步互斥:在同一时刻只允许一个线程访问共享资源同步:线程之间如何通信...

网友评论

      本文标题:管程

      本文链接:https://www.haomeiwen.com/subject/fiyflctx.html