Java中sleep和wait有什么区别?
来源:互联网 发布:mysql 重启服务 编辑:程序博客网 时间:2024/05/22 05:51
sleep和wait有什么区别?大家都说是sleep不会释放锁,wait会释放锁。一直都不是很理解。最近在看AQS代码,才找到一些蛛丝马迹。AQS的await和wait实现思想类似,释放当前占有的锁,让其他线程继续获取锁。等适合机会唤醒后再重新占有锁。
await方法有fullyRelease的方法
1.先将线程插入等待队列;
2.释放当前的占有的资源,即释放锁;
3.让当前线程停止,等待唤醒;
4.唤醒后继续争抢锁。
public final void await() throws InterruptedException { if (Thread.interrupted()) throw new InterruptedException(); Node node = addConditionWaiter(); int savedState = fullyRelease(node); int interruptMode = 0; while (!isOnSyncQueue(node)) { LockSupport.park(this); if ((interruptMode = checkInterruptWhileWaiting(node)) != 0) break; } if (acquireQueued(node, savedState) && interruptMode != THROW_IE) interruptMode = REINTERRUPT; if (node.nextWaiter != null) // clean up if cancelled unlinkCancelledWaiters(); if (interruptMode != 0) reportInterruptAfterWait(interruptMode); }
fullyRelease先保存当前资源,然后释放资源。等待适合时机再恢复当前的状态。
final int fullyRelease(Node node) { boolean failed = true; try { int savedState = getState(); if (release(savedState)) { failed = false; return savedState; } else { throw new IllegalMonitorStateException(); } } finally { if (failed) node.waitStatus = Node.CANCELLED; } }
跟进去release方法看看,执行tryRelease,然后unparkSuccessor,就是唤醒后继线程。因此await会释放其占有的资源,换句话说就是释放其占有的锁。让其他线程有机会获取锁。
public final boolean release(int arg) { if (tryRelease(arg)) { Node h = head; if (h != null && h.waitStatus != 0) unparkSuccessor(h); return true; } return false; }
1 0
- Java多线程中sleep()和wait()有什么区别
- Java多线程中sleep()和wait()有什么区别
- JAVA中sleep() 和 wait() 有什么区别?
- Java中sleep和wait有什么区别?
- Java sleep() 和 wait() 有什么区别
- Java sleep()和wait()有什么区别
- 线程中sleep和wait有什么区别
- 线程中sleep和wait有什么区别
- 线程中sleep和wait有什么区别
- 线程中sleep和wait有什么区别
- 线程中sleep和wait有什么区别
- sleep和wait有什么区别
- sleep() 和 wait() 有什么区别
- sleep和wait有什么区别
- sleep() 和 wait() 有什么区别?
- sleep() 和 wait() 有什么区别?
- sleep和wait有什么区别。
- sleep() 和 wait() 有什么区别?
- MyBatis 官方文档学习2---XML 映射配置文件
- 蓝桥杯 —— 石子合并问题 —— Dp
- R语言 读取文件,一行一行处理, 写入文件
- list集合删除问题
- 删除字符串中指定的字符
- Java中sleep和wait有什么区别?
- 浅谈yahoo前端性能团队总结的35条黄金定律
- Lua入门第一节 序章
- 96. Unique Binary Search Trees
- 实验1:2
- Redis与Memcached的区别
- Android自定义View之PinnerHeaderListView
- pthread_create传递线程参数需要注意的问题
- android studio gradle配置