- 锁池
所有需要竞争同步锁的线程都会放在锁池当中,比如某个对象的同步锁被其中一个线程得到,则其它线程需要在锁池中等待,当前面的线程释放掉同步锁后锁池中的线程去竞争同步锁,得到锁的线程进入就绪队列等待CPU资源分配。
- 等待池
当调用wait()方法后,线程会放到等待池中,等待池中的线程不会去竞争同步锁。只有调用了notify()或notifyAll()后等待池中的线程才会开始竞争同步锁,notify()是随机从等待池选出一个线程放到锁池,而notifyAll()是将等待池中的所有线程放到锁池中。
- sleep是Thread类的静态本地方法,wait是Object类的本地方法。
- sleep方法不会释放lock,但是wait会释放,而且会加入到等待队列中。
sleep()就是把CPU的执行资格和执行权释放出去,不再运行此线程,定时时间结束再取回cpu资源,参与cpu调度。如果sleep()时该线程有锁,sleep时不会释放这个锁,而是把锁带着进入冻结状态,也就是说其它需要这个锁的线程根本获取不到这个锁,则程序无法执行。
如果在睡眠期间其他线程调用了这个线程的interrupt方法,那么这个线程也会抛出interruptexception异常返回,这点和wait是一样的。
- sleep不需要被唤醒(休眠之后退出阻塞),但是wait需要(不指定时间需要被别人中断)
- join()执行后线程进入阻塞状态。例如在A线程中调用B线程的join()方法,则A线程就会进入阻塞队列,直到B线程执行结束或中断。
- yield()方法执行后线程直接进入就绪状态,马上释放了CPU的执行权,但依然保留了CPU的执行资格,所以有可能下次CPU进行线程调度这个线程还有获取到CPU执行权继续执行。
posted @
2023-01-30 22:35
程长新
阅读(
34)
评论()
编辑
收藏
举报
点击右上角即可分享
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 2 本地部署DeepSeek模型构建本地知识库+联网搜索详细步骤