您现在的位置: 首页 > 网站导航收录 > 百科知识百科知识
Java并发线程如何阻塞和唤醒?
线程,队列,方法Java并发线程如何阻塞和唤醒?
发布时间:2016-12-08加入收藏来源:互联网点击:
Java并发线程如何阻塞和唤醒?
回答于 2019-09-11 08:43:50
回答于 2019-09-11 08:43:50
每个对象都有两个方法wait和notify,加上同步
回答于 2019-09-11 08:43:50
Java并发线程的阻塞和唤醒可分几类:
1. synchronize
基于JVM的对象头来实现,多线程争抢同一个临界资源时根据不同的锁机制(自旋锁、轻/重量级锁)来进行阻塞和唤醒。
2. notify/wait,yeild等基础机制
这里暂时略过,大致实现原理是基于对象的同步队列和后面的AQS很像。
3. 并发组件的基础AQS
重点说下AQS(AbstractQueuedSynchronizer),
因为这是jdk并发包实现的基础(如Lock、BlockingQueue、CountdownLatch等)。
Aqs基本由一个volatile变量state和一个等待队列来实现,抢锁时先CAS修改state,失败以后就放到等待队列里,并通过LockSupport将线程挂起。
当锁的拥有者释放锁时会通过LockSupport唤醒等待队列的后续节点,让它再次去尝试抢锁(CAS修改state),如此反复。
掌握AQS的原理对理解jdk里很多并发组件非常有帮助。
回答于 2019-09-11 08:43:50
1. sleep() 方法:以毫秒为单位,使线程处于阻塞状态,时间到了过后,自动唤醒。
2.suspend() 和 resume() 方法:挂起和唤醒线程,suspend e()使线程进入阻塞状态,只有对应的resume e()被调用的时候,线程才会进入可执行状态。这个不建议使用,容易发生死锁情况。
3. yield() 方法:调用 yield()的效果等价于调度程序认为该线程已执行了足够的时间从而转到另一个线程
这里就说这三种吧,其它的你可以去csdn上门看看,学习一下
下一篇:返回列表
相关链接 |
||
网友回复(共有 0 条回复) |