博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
监视器–JAVA同步基本概念
阅读量:7024 次
发布时间:2019-06-28

本文共 1145 字,大约阅读时间需要 3 分钟。

大学有一门课程叫操作系统,学习过的同学应该都记得,监视器是操作系统实现同步的重要基础概念,同样它也用在JAVA的线程同步中,这篇文章用一种类推的思想解释监视器”monitor”。

1.什么是监视器

监视器可以看做是经过特殊布置的建筑,这个建筑有一个特殊的房间,该房间通常包含一些数据和代码,但是一次只能一个消费者(thread)使用此房间,

Java-Monitor

当一个消费者(线程)使用了这个房间,首先他必须到一个大厅(Entry Set)等待,调度程序将基于某些标准(e.g. FIFO)将从大厅中选择一个消费者(线程),进入特殊房间,如果这个线程因为某些原因被“挂起”,它将被调度程序安排到“等待房间”,并且一段时间之后会被重新分配到特殊房间,按照上面的线路,这个建筑物包含三个房间,分别是“特殊房间”、“大厅”以及“等待房间”。

java-monitor-associate-with-object

简单来说,监视器用来监视线程进入这个特别房间,他确保同一时间只能有一个线程可以访问特殊房间中的数据和代码。

2.JAVA中监视器的实现

在JAVA虚拟机中,每个对象(Object和class)通过某种逻辑关联监视器,为了实现监视器的互斥功能,每个对象(Object和class)都关联着一个锁(有时也叫“互斥量”),这个锁在操作系统书籍中称为“信号量”,互斥(“mutex “)是一个二进制的信号量。

如果一个线程拥有了某些数据的锁,其他的线程则无法获得锁,直到这个线程释放了这个锁。在多线程中,如果任何时候都是我们自己来写这个信号量,显然不是很方便,幸运的是,JVM为我们自动实现了这些。

为了使数据不被多个线程访问,java 提供了同步块 以及 同步方法两种实现,一旦一段代码被嵌入到一个synchronized关键字中,意味着放入了监视区域,JVM在后台会自动为这段代码实现锁的功能。

3.JAVA的同步代码中,哪一部分是监视器?

我们知道JAVA每个对象(Object/class) 都关联一个监视器,更好的说法应该是每个对象(Object/class)都有一个监视器,对象可以有它自己的临界区,并且能够监视线程序列为了使线程协作,JAVA为提供了wait()和notifyAll以及notify()实现挂起线程,并且唤醒另外一个等待的线程,此外这些方法有三种不同版本:

1 wait(long timeout, int nanos)
2 wait(long timeout) notified by other threads or notified by timeout.
3 notify(all)

这些方法只能在一个同步块或同步方法中被调用,原因是,如果一个方法不需要相互排斥,不需要监测或线程之间协作,每一个线程可以自由访问此方法,那就不需要协作。

  • 转载自 
你可能感兴趣的文章
个人使用unity3d过程中遇到的一些小问题集合之有时候在场景中创建光源会有一条虚线...
查看>>
POJ2774:Long Long Message——题解
查看>>
2018-2019 20165226 网络对抗 Exp1 PC平台逆向破解
查看>>
javascript作用域与预解析
查看>>
unity 代码有调整,重新导出 iOS 最烦的就是 覆盖导出后项目不能打开
查看>>
C# 中的拓展方法,以StringBuilder加上IndexOf方法举例
查看>>
[转载]部署Office Web Apps Server并配置其与SharePoint 2013的集成
查看>>
第41件事 创新设计的4种方法
查看>>
python学习===计算字符串中子串出现的次数。
查看>>
页面在谷歌浏览器和IE浏览器顶部多出空白行,火狐显示正常
查看>>
CSS子元素设置margin-top作用于父容器?
查看>>
VS Code
查看>>
做了6年开发,工资涨不上去,怎么办?
查看>>
微信5.2
查看>>
C++运算符重载笔记
查看>>
Android中数据库和安装包分离
查看>>
Android调用系统功能
查看>>
关于chorme 通知功能
查看>>
9-1迭代器
查看>>
new , delete常见用法和与malloc,free比较
查看>>