`

Java Concurrent之 java自带monitor机制

 
阅读更多

   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方法自动释放监视锁,进入等待状态。



 

 

  • 大小: 29.6 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics