JAVA——多线程编程之同步“监视器monitor”(三)
2017-04-10 16:45
246 查看
转载来源:
http://www.programcreek.com/2011/12/monitors-java-synchronization-mechanism/
http://ifeve.com/monitors-java-synchronization-mechanism/
监视器是操作系统实现同步的重要基础概念,同样它也用在JAVA的线程同步中,这篇文章用一种类推的思想解释监视器”monitor”。
当一个消费者(线程)使用了这个房间,首先他必须到一个大厅(Entry Set)等待,调度程序将基于某些标准(e.g.FIFO)将从大厅中选择一个消费者(线程),进入特殊房间,如果这个线程因为某些原因被“挂起”,它将被调度程序安排到“等待房间”,并且一段时间之后会被重新分配到特殊房间,按照上面的线路,这个建筑物包含三个房间,分别是“特殊房间”、“大厅”以及“等待房间”。
简单来说,监视器用来监视线程进入这个特别房间,他确保同一时间只能有一个线程可以访问特殊房间中的数据和代码。
如果一个线程拥有了某些数据的锁,其他的线程则无法获得锁,直到这个线程释放了这个锁。在多线程中,如果任何时候都是我们自己来写这个信号量,显然不是很方便,幸运的是,JVM为我们自动实现了这些。
为了使数据不被多个线程访问,java 提供了同步块 以及同步方法两种实现,一旦一段代码被嵌入到一个synchronized关键字中,意味着放入了监视区域,JVM在后台会自动为这段代码实现锁的功能。
这些方法只能在一个同步块或同步方法中被调用,原因是,如果一个方法不需要相互排斥,不需要监测或线程之间协作,每一个线程可以自由访问此方法,那就不需要协作。
在监视器(Monitor)内部,是如何做线程同步的?
监视器和锁在Java虚拟机中是一块使用的。监视器监视一块同步代码块,确保一次只有一个线程执行同步代码块。每一个监视器都和一个对象引用相关联。线程在获取锁之前不允许执行同步代码。
监视器的其他相关知识,网址:
http://wangym.iteye.com/blog/1265973
http://blog.csdn.net/lirx_tech/article/details/50913520
https://zhidao.baidu.com/question/2266270659590811188.html
Java同步机制之Monitor监视器与syncrhoized实现原理:http://www.cnblogs.com/ygj0930/p/6561667.html
http://www.programcreek.com/2011/12/monitors-java-synchronization-mechanism/
http://ifeve.com/monitors-java-synchronization-mechanism/
监视器是操作系统实现同步的重要基础概念,同样它也用在JAVA的线程同步中,这篇文章用一种类推的思想解释监视器”monitor”。
【1】什么是监视器
监视器可以看做是经过特殊布置的建筑,这个建筑有一个特殊的房间,该房间通常包含一些数据和代码,但是一次只能一个消费者(thread)使用此房间。当一个消费者(线程)使用了这个房间,首先他必须到一个大厅(Entry Set)等待,调度程序将基于某些标准(e.g.FIFO)将从大厅中选择一个消费者(线程),进入特殊房间,如果这个线程因为某些原因被“挂起”,它将被调度程序安排到“等待房间”,并且一段时间之后会被重新分配到特殊房间,按照上面的线路,这个建筑物包含三个房间,分别是“特殊房间”、“大厅”以及“等待房间”。
简单来说,监视器用来监视线程进入这个特别房间,他确保同一时间只能有一个线程可以访问特殊房间中的数据和代码。
【2】JAVA中监视器的实现
在JAVA虚拟机中,每个对象(Object和class)通过某种逻辑关联监视器,为了实现监视器的互斥功能,每个对象(Object和class)都关联着一个锁(有时也叫“互斥量”),这个锁在操作系统书籍中称为“信号量”,互斥(“mutex”)是一个二进制的信号量。如果一个线程拥有了某些数据的锁,其他的线程则无法获得锁,直到这个线程释放了这个锁。在多线程中,如果任何时候都是我们自己来写这个信号量,显然不是很方便,幸运的是,JVM为我们自动实现了这些。
为了使数据不被多个线程访问,java 提供了同步块 以及同步方法两种实现,一旦一段代码被嵌入到一个synchronized关键字中,意味着放入了监视区域,JVM在后台会自动为这段代码实现锁的功能。
【3】JAVA的同步代码中,哪一部分是监视器?
我们知道JAVA每个对象(Object/class)都关联一个监视器,更好的说法应该是每个对象(Object/class)都有一个监视器,对象可以有它自己的临界区,并且能够监视线程序列为了使线程协作,JAVA为提供了wait()和notifyAll以及notify()实现挂起线程,并且唤醒另外一个等待的线程,此外这些方法有三种不同版本:wait(long timeout, int nanos) wait(long timeout) notified by other threads or notified by timeout. notify(all)
这些方法只能在一个同步块或同步方法中被调用,原因是,如果一个方法不需要相互排斥,不需要监测或线程之间协作,每一个线程可以自由访问此方法,那就不需要协作。
在监视器(Monitor)内部,是如何做线程同步的?
监视器和锁在Java虚拟机中是一块使用的。监视器监视一块同步代码块,确保一次只有一个线程执行同步代码块。每一个监视器都和一个对象引用相关联。线程在获取锁之前不允许执行同步代码。
监视器的其他相关知识,网址:
http://wangym.iteye.com/blog/1265973
http://blog.csdn.net/lirx_tech/article/details/50913520
https://zhidao.baidu.com/question/2266270659590811188.html
Java同步机制之Monitor监视器与syncrhoized实现原理:http://www.cnblogs.com/ygj0930/p/6561667.html
相关文章推荐
- java多线程编程之使用Synchronized关键字同步类方法
- java多线程编程之使用Synchronized块同步方法
- JAVA——多线程编程之同步:同步代码块与同步函数(二)
- java多线程编程之使用Synchronized块同步方法
- 【转载】Java多线程编程2--同步锁定--死锁
- (Java多线程)分析静态方法所适用的同步监视器对象是什么?
- java多线程编程之使用Synchronized块同步变量
- java多线程编程之为什么要进行数据同步
- JAVA多线程编程设计模式:Half-sync/Half-async(半同步/半异步)模式
- Java多线程编程-同步方法
- Java同步机制之Monitor监视器与syncrhoized实现原理
- Java多线程编程--(3)线程互斥、同步的理解
- Java多线程并发编程之构建自定义同步工具
- Java的多线程之同步篇三:同步阻塞、监视器、volatile、final、原子性、线程局部变量、锁测试与超时、读写锁
- Java同步机制之Monitor监视器与syncrhoized实现原理
- 【Java基础】7、Java同步机制之Monitor监视器与syncrhoized实现原理
- Java知识点整理:第十四章:java多线程编程、创建一个线程、异步与同步、java反射、类加载
- java多线程编程之使用Synchronized块同步变量
- Java多线程编程之CountDownLatch同步工具使用实例
- java多线程编程之使用Synchronized块同步变量