本文主要是介绍Montior监视器对象与操作系统的管程(monitors),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
什么是管程?
管程保证了同一时刻只有一个进程/线程在管程内对共享变量进行操作,其封装了一套对共享资源访问的模型。其作用是保证多进程或者多线程访问同一个资源时,能够达到“互斥”、“同步”的效果。
管程的内部如上图所示。
使用过程如下:
- 同步队列的线程去获取管程中共享变量的执行权,如果成功则执行对共享变量的处理。如果失败则返回同步队列。
- 对于成功获取到管程执行权的进行对共享变量的处理操作,执行完毕后可以唤醒同步队列的线程,重新竞争锁。也可以进行wait,将线程添加到等待队列中。当其他线程进行notify唤醒操作的时候,等待队列的线程移动到同步队列,重新竞争锁。
管程的实现
管程的实现,其实就是JAVA是通过sychronyzed关键字,和wait()、notify、notifyAll() 方法实现了整个管程模型。执行方式如下
总结
- java中synchronized关键字完整实现了管程的模型,因为synchronized锁的是对象,而wait()、notify()、notifyall()是对象的父类Object类中的方法。
- 管程在java的内部实现其实是一个monitor监视器,而monitor监视器中的字段(owner、recursions、waitSet、EntryList)就是实现管程的数据结构,只不是monitor将其封装在ObjectMonitor中。
- monitor实现的是最简单的,只有一个等待队列。而管程其实可以 设计多个等待队列。
参考
锁原理-管程
java里的管程
Monitor的实现原理
这篇关于Montior监视器对象与操作系统的管程(monitors)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!