在Java领域,解决并发问题并不是使用的常见的信号量这种万能钥匙,而是采用了管程技术

常见的实现体现在 wait notify notifyAll 三个方法汇总,但是管程和信号量两者是等价的,两者可以彼此间互相转换

对于管程,官方的解释为 管理共享变量和共享变量的操作的过程,让其支持并发

在整个管程的历史上发明了三个不同的管程模型,分别是

Hasen模型,Hoare模型 MESA模型

在Java中基于了MESA模型来实现的

在整个并发编程的领域,需要考虑 互斥和同步

原生提供了Synchronized关键字,后来提供了Lock和Condition

首先是互斥

将对共享变量的操作封装起来,

比如一个队列对象,将对象的入队和出队封装起来,保证了出队入队的操作互斥

图片 这正好符合面向对象中的封装

对于同步,则是如下的一张图

图片

在管程模型汇总,共享变量和其操作是被封装了的,最外层的框代表了封装的意思,框的商店有一个入口,入口旁边有个等待队列,在试图进入的时候,,就只有一个人能进入,其他的都在等待队列中等待

对于管程中,还引入了条件变量的思想,每个条件变量都有一个等待队列

也就是说,只有满足了条件变量之后,才能进入等待队列或从其中出去,

对于MESA模型,需要是一个线程的范式,就是在while()中循环调用wait()

while(条件不满足) {

wait();

}

再说说关于Hasen模型,Hoare模型 Mesa模型三者对于满足通知条件时候,如何通知的

Hasen模型,要求notify放在代码最后,T2完成后通知T1,T2结束了

Hoare,T2通知到T1,T2阻塞,T1执行,T2完成后,再通知T1,多一次通知唤醒的操作

Mesa模型,T2通知T1,T2继续执行,T1从等待队列到入口队列汇总,进行查看是否执行,但是很可能会出现曾经满足的条件,现在不满足了,所以要循环检测执行

发表评论

邮箱地址不会被公开。 必填项已用*标注