Monitor和Semaphore之间的主要区别是什么?
Monitor和Semaphore之间的主要区别是什么?
Answers:
甲监视器是设计成从多个线程访问的对象。监视对象的成员函数或方法将强制相互排斥,因此在给定时间只有一个线程可以对该对象执行任何操作。如果一个线程当前正在执行该对象的成员函数,则任何其他试图调用该对象的成员函数的线程都必须等待,直到第一个线程完成。
甲信号量是一种较低级的对象。您可能会使用信号量来实现监视器。信号量实质上只是一个计数器。当计数器为正数时,如果线程尝试获取信号量,则允许该信号量,并且计数器递减。线程完成后,它将释放信号量,并增加计数器。
如果在线程尝试获取信号量时计数器已经为零,则它必须等到另一个线程释放该信号量。如果一个线程释放一个信号量时有多个线程正在等待,则其中一个会得到它。释放信号量的线程不必与获取信号量的线程相同。
监视器就像公共厕所。一次只能输入一个人。他们锁上门以防止其他任何人进来,处理自己的东西,然后在离开时将其解锁。
信号灯就像自行车出租处。他们有一定数量的自行车。如果您尝试租用一辆自行车,而他们有一辆免费的自行车,则可以搭乘,否则必须等待。当有人将自行车归还时,其他人可以骑它。如果您有一辆自行车,则可以将其交给其他人归还---自行车出租处并不关心谁归还它,只要他们把自行车归还。
以下解释实际上说明了监视器的wait()和signal()与信号量的P和V有何不同。
在监视器中对条件变量进行的wait()和signal()操作类似于对信号量进行计数的P和V操作。
等待语句可以阻止进程的执行,而信号语句可以导致另一个进程被取消阻止。但是,有一些差异它们之间。当进程执行P操作时,它不一定会阻塞该进程,因为计数信号量可能大于零。相反,当执行wait语句时,它总是阻塞进程。当任务在信号量上执行V操作时,它会取消阻止等待该信号量的任务,或者如果没有要解锁的任务,则增加信号量计数器。另一方面,如果在没有其他要取消阻塞的进程的情况下一个进程执行了信号声明,则对条件变量没有影响。信号量和监视器之间的另一个区别是,被V操作唤醒的用户可以立即恢复执行。相反,仅当监视器解锁时,通过信号操作唤醒的用户才会重新启动。此外,
链接:此处供进一步阅读。希望能帮助到你。
java.util.ArrayList
:是一个对象还是多个对象的容器?好吧,这是同时存在的。那么信号量是否适合控制对它的访问?我会说:不。
当使用信号量保护关键区域时,信号量与受保护的数据之间没有直接关系。这就是为什么信号可能散布在代码周围以及为什么容易忘记调用wait或notify的部分原因,在这种情况下,结果将分别是违反互斥或永久锁定资源。
相反,监视器可能会发生这些不良情况。监视器直接对数据感到厌倦(它封装了数据),并且由于监视器操作是原子操作,因此如果不调用入口协议就无法编写可以访问数据的代码。监视操作完成后,将自动调用退出协议。
监视器具有内置的机制,可以在进行操作之前以条件变量的形式进行条件同步。如果不满足条件,则该过程必须等待,直到被通知条件发生变化。当进程正在等待条件同步时,监视器实现将解决互斥问题,并允许另一个进程访问监视器。
摘自公开大学M362第3单元“交互过程”课程材料。
信号量:
使用计数器或标志控制并发系统中某些共享资源的访问,意味着使用Semaphore。
例:
标志仅显示资源的当前状态,不显示有关资源上正在等待或正在运行的对象的计数或任何其他信息。
监控器:
一个监视器与感兴趣的是对象的线程沟通,要求他们获取访问或等待一些条件,以成为真正的同步访问对象。
例: