java线程问题探析
问题描述:
在 Head First Java 中的示例代码探究线程并发性时,发生了如下输出:

其中,前两句由一个线程执行,随后该线程进入睡眠状态。问题在于,在该线程睡眠期间,另一个线程并非从头开始执行,而是从 makeWithdrawl 方法内部开始。
立即学习“Java免费学习笔记(深入)”;
豆包AI编程
豆包推出的AI编程助手
483 查看详情
问题解答:
理解该现象的关键在于线程并发性的本质。当两个线程同时运行时,它们并非按照严格的顺序执行,而是争用 CPU 资源。即使一个线程进入睡眠状态,另一个线程也可能从该线程执行的任意位置中断执行。
如示例代码所示,两个线程共享一个 BankAccount 对象,并同时对该对象的余额进行操作。当第一个线程进入睡眠状态时,第二个线程正好处于 makeWithdrawal 方法的内部。这是因为:
sleep() 方法并非立刻让出 CPU 资源。在第一个线程调用 sleep() 方法之前,它已经获取了 BankAccount 对象的锁。当第二个线程尝试访问 BankAccount 对象时,它由于锁被第一个线程持有而被阻塞。因此,当第一个线程进入睡眠状态并释放锁时,第二个线程才能继续执行,而此時已处于 makeWithdrawal 方法中。
简而言之,线程并发性允许不同的线程在共享资源上并行运行,即使其他线程处于活动状态或睡眠状态。
以上就是Java 线程并发:为什么线程睡眠后另一个线程会从方法内部开始执行?的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/418089.html
微信扫一扫
支付宝扫一扫