java自带的monitor机制,其实是一种解决同步的机制。
当遇到并发情况时,多个线程同时访问一个对象,那么我们为了数据的一致性,只能给其中的一个线程发放通行证(我们姑且将monitor描述成一个对象,线程获取通行证其实等价于线程获得这个monitor对象,当该线程执行完它的工作需要将monitor对象归还 然后其他等待的线程则有机会获得monitor对象 执行自己的逻辑,那么当一个线程访问一个对象时发现它的monitor对象被其他对象占用了,它们在"Entry set"中排好队等待获取monitor对象)。
当然这个持有monitor对象通行证的线程也可以选择暂时放弃当前的使用权(singal机制/notify、notifyAll),去等待某个条件变量(例如:java.lang.Object.wait()),当条件成立后,当前进程就会通知这个正在等待该条件变量的线程可以去重新获取使用权限了。
那么什么是条件变量?
条件变量通常是一个线程作为使自己等待,直到一个涉及共享数据的条件表达式达到特定的状态。当另外的协作线程通知共享数据的状态已经发生变化,调度器就唤醒在该条件变量上挂起的线程。于是新唤醒的线程重新对它的条件表达式进行求值,如果共享数据已达到合适状态,就恢复处理。
相比于C++,java无需自己封装条件变量类,java的根类Object提供了wait/notify/notifyAll方法给开发者,非常容易使用。
综上所述:java monitor从两个方面来支持线程之间的同步,即:互斥执行与协作。java使用对象锁(使用synchronized获得对象锁)保证工作在共享的数据集上的线程互斥执行。另一方面,使用wait/notify/notifyAll方法来协同不同线程之间的工作。这些方法都在java.lang.Object中定义,会被所有的java对象自动继承。
本质上,java的Object对象本身就是一个监视者对象,java对于这样一个典型并发设计模式做了内建的支持。不过java中我们已经看不到像C++中的区域锁和条件变量了。
如下图,线程如果获得监视锁成功,将成为监视者对象的拥有者。在任何一个时刻,监视者对象只属于一个活动线程,这个活动线程可以通过调用wait方法自动释放监视锁,进入等待状态。
相关推荐
java concurrent 阻塞队列 线程 里面有详细的例子,下载后请认真阅读里面的内容,可能有点难以理解,请耐心
Java Concurrent in practice (animated)
java concurrent 包 详细解析
使用java concurrent调用xmlp api生成pdf
JAVA的CONCURRENT用法详解.pdf
资深Java专家10年经验总结,全程案例式讲解,首本全面介绍Java多线程编程技术的专著 结合大量实例,全面讲解Java多线程编程中的并发访问、线程间通信、锁等最难突破的核心技术与应用实践 封底 Java多线程无处不在,...
java concurrent 多线程 PPT
Java Concurrent处理并发需求.txt
1. java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 ...
java并发工具包 java.util.concurrent中文版pdf
java concurrent包分类结构图
详细的java 多线程相关知识 并附有相关练习题
java同步大杀器concurrent 包java同步大杀器concurrent 包java同步大杀器concurrent 包java同步大杀器concurrent 包java同步大杀器concurrent 包java同步大杀器concurrent 包java同步大杀器concurrent 包java同步大...
EBS java concurrent program的实现
JUC使用指导手册 http://tutorials.jenkov.com/java-util-concurrent/blockingqueue.html 中文译文
面试 面试_Java一些常见面试题+题解之多线程开发_JavaConcurrent
JAVAConcurrent Programming in Java 对于一些JAVA 理解
如何启动:以win7系统为例,最好jdk8 1.打开cmd,cd到jdk的path,本机是:cd C:\Java\jdk6\bin ...java -cp D:\javaConcurrentAnimated.jar vgrazi.concurrent.samples.launcher.ConcurrentExampleLauncher
资源JavaConcurrent实用知识库分享知识分享
Concurrent Programming in Java - Design Principles and Patterns