wait/notify,sleep方法
2017-08-15 16:58
190 查看
wait/notify源码
wait是用来让线程等待的,并且释放锁。notify是用来唤醒等待线程的,执行完后,在同一同步队列中的等待线程开始抢占锁。
监视器: monitor
锁: lock(JVM里只有一种独占方式的lock)
进入监视器: monitorenter
离开/释放监视器: monitorexit
(monitorenter和monitorexit是JVM的指令)
拥有者: owner
通过synchronized来完成的,使用了
monitorenter指令和
monitorexit指令
monitor使用了ObjectMonitor来实现。
JAVA程序中每一个监视区域都和一个对象引用相关联。
锁住一个对象相当于获得对象相关联的监视器
这里的监视器可以比喻成一个房间,进入房间相当于进入监视器,占据房间相当于持有监视器,离开房间相当于释放监视器。
每个线程都有ObjectMonitor 的free和used的objectMonitor对象列表,如果没有free objectMonitor对象列表,将向global 中ListLock Allocate为了提高效率
在上图中可以看见成员里头有2个队列:_WaitSet和_EntryList(保存ObjectWaiter对象列表);_owner执向获得ObjectMonitor对象的线程。看图
_WaitSet :处于wait状态的线程,会被加入到wait set;
_EntryList:处于等待锁block状态的线程,会被加入到entry set;
ObjectWaiter对象是双向链表结构,保存了_thread(当前线程)以及当前的状态TState等数据, 每个等待锁的线程都会被封装成ObjectWaiter对象,然后加入不同的队列中去。
wait方法实现
将当前线程封装成ObjectWaiter对象
->node;
通过
ObjectMonitor :: AddWaiter方法将node添加到
_WaitSet列表中;
通过
ObjectMonitor :: exit方法释放当前的
ObjectMonitor对象,这样其它竞争线程就可以获取该
ObjectMonitor对象。
最终底层的park方法会挂起线程。
notify方法实现
如果当前_WaitSet为空,即没有正在等待的线程,则直接返回;
通过
ObjectMonitor :: DequeueWaiter方法,获取
_WaitSet列表中的第一个
ObjectWaiter节点,实现很简单。
notifyAll方法实现
跟notify差不多,就是第二步直接用for循环取出所有的_WaitSet中的节点。
对于java中的sleep实现
我想,应该是和LinuxC下的sleep类似的。。。肯定不一样通过底层alarm设定闹钟,闹钟会发信号给这个线程。 sleep是不会释放锁的。
sleep是Thread中的静态方法。
相关文章推荐
- sleep() yield() wait() notify() notifyAll()方法
- (四)wait()、notify()、notifyAll()方法||wait()与sleep()的区别
- java多线程应用中常用的sleep、yield、join、wait、notify、notifyAll方法介绍
- Java并发07:Thread的基本方法(4)-Thread.sleep()、Object.wait()、notify()和notifyAll()
- 线程中的一些常用方法的用法 join()、yield()、sleep()、wait()、notify()、notifyAll()
- Java线程中sleep()、wait()和notify()和notifyAll()、yield()、join()等方法的用法和区别
- java线程的sleep(),wait(),notify(),yield()方法的区别要点
- java Thread方法解析: sleep join wait notify notifyAll
- java notify()、 notifyAll()、 wait()、sleep()、yield()、join()方法学习
- java中线程阻塞之sleep、suspend、join、wait、resume、notify方法解析(一)
- 一目了然,Java线程各方法区别:sleep, yield, join, wait, notify
- java线程的sleep(),wait(),notify(),yield()方法的区别要点
- Java中的Object的Wait() 和notify()方法使用时应注意的地方和Thread中的sleep()方法
- Java线程中sleep()、wait()和notify()和notifyAll()、yield()、join()等方法的用法和区别
- 关于Java线程的sleep(),wait(),notify(),notifyall(),interrupt()等各种方法
- Java多线程中的一些方法介绍wait()、notify()、sleep()、interrupt()
- 实践JAVA wait(), notify(),sleep方法--一道多线程的面试题
- 线程wait( )、sleep( )、notify( )方法
- Java线程中sleep()、wait()和notify()和notifyAll()、yield()、join()等方法的用法和区别
- Java线程中sleep()、wait()和notify()和notifyAll()、yield()、join()等方法的用法和区别