设为首页 加入收藏

TOP

Java 中的 wait 和 notify 实现的源码分析
2014-11-24 14:36:58 来源: 作者: 【 】 浏览:2
Tags:Java wait notify 实现 源码 分析

先介绍2个对象:


1. ObjectMonitor 对象 主要用来监视创立的Object


在synchronizer.cpp 里定义了,ObjectMonitor 的对象,我们来看ObjectMonitor的对象的结构体



每个object的对象里 markOop->monitor() 里可以保存ObjectMonitor的对象。


建立ObjectMonitor的算法:


如果不存在,可以向Thread 的ObjectMonitor 的对象列表中Allocate free objectMonitor 对象。


每个线程都有ObjectMonitor 的free和used的objectMonitor对象列表,如果没有free objectMonitor对象列表,将向global 中ListLock Allocate为了提高效率。


2. ObjectWaiter 对象


ObjectWaiter 对象



ObjectWaiter 对象里存放thread(线程对象) 和 ParkEvent(线程的unpark), 每一个等待锁的线程都会有一个ObjectWaiter对象.


而objectwaiter是个双向链表结构的对象。


我们可以看到在ObjectMonitor对象里有2个队列成员_WaitSet 和 _EntryList 存放的就是ObjectWaiter


_WaitSet:


主要存放所有wait的线程的对象,也就是说如果有线程处于wait状态,将被挂入这个队列


_EntryList:


所有在等待获取锁的线程的对象,也就是说如果有线程处于等待获取锁的状态的时候,将被挂入这个队列。


Wait 方法实现:


ObjectSynchronizer::wait方法


通过object的对象中找到ObjectMonitor对象


调用方法


void ObjectMonitor::wait(jlong millis, bool interruptible, TRAPS)


通过ObjectMonitor::AddWaiter调用把新建立的ObjectWaiter对象放入到 _WaitSet 的队列的末尾中


然后在ObjectMonitor::exit释放锁,接着 thread_ParkEvent->park 也就是wait


Notify方法的实现:


ObjectSynchronizer::notify方法


调用ObjectSynchronizer::inflate


object的对象中找到ObjectMonitor对象


然后调用方法ObjectMonitor::notify


调用ObjectMonitor::DequeueWaiter 摘除第一个ObjectWaiter对象从_WaitSet 的队列中


并把这个ObjectWaiter对象放入_EntryList中,_EntryList 存放的是ObjectWaiter的对象列表,列表的大小就是那些所有在等待这个对象锁的线程数。


注意这里并没有调用ObjectMonitor::exit释放锁


NotifyALL和Notify 的区别就是


通过遍历调用ObjectMonitor::DequeueWaiter,把所有的_WaitSet的队列中的ObjectWaiter对象放入到_EntryList中


关于放入到_EntryList的策略大概有4中Policy,其中还涉及到一个_cxq的队列,先不具体介绍了


notify, 和notifyAll 都没有释放对象的锁,而是在Synchronizer同步块结束的时候释放


如何释放锁


调用ObjectMonitor::exit


从_EntryList里找到一个ObjectWaiter,因为ObjectWaiter里有线程的_event ParkEvent 调用unpark() 通知ObjectWaite里的线程运行(拿到锁),具体实现在ObjectMonitor::ExitEpilog方法里


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Android GPS数据收集实验程序 下一篇监听不到Android 的 Home 键

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: