9
回答
Java中的阻塞底层是如何实现的?
华为云实践训练营,热门技术免费实践!>>>   

Java中的阻塞底层是如何实现的?

比如 wait()方法调用之后会阻塞。 Socket read()等待内容时候的的阻塞。
这些阻塞底层是如何实现的。 和在代码前面放一个while循环来阻塞有什么不同?

<无标签>
举报
快速开发师
发帖于2个月前 9回/189阅

wait,read 之类的依赖于操作系统的调度,相应线程会放到等待队列中,不再活动,CPU 不会调度它,直到收到某些信号为止,才会再次激活放回到调度队列中;在此之前,线程就一直“阻塞”了。

while 则不同,属于“忙等待”(busy waiting),线程一直是活动的,会占用 CPU 的资源,在 CPU 眼中它跟其它活动线程没有区别。只是在我们眼中,程序一直没有“进展”而已。

硬件实现的

--- 共有 5 条评论 ---
沧海_Sea 回复 @绫小路清隆 : 不对的 肯定要先造个发电机 先找个墙角绕线圈去吧 2个月前 回复
在下路哥 回复 @沧海_Sea : 最终还不是硬件等待信号返回,然后释放软件层面的IO阻塞,没毛病吧~ 2个月前 回复
沧海_Sea 回复 @Zemo : 首先你要有一个发电机 2个月前 回复
Zemo 回复 @快速开发师 : 还得加上电信号 2个月前 回复
快速开发师你直接告诉我是合金和塑料实现的算了 2个月前 回复

首先,我看到楼主回复笑的不行了

--- 共有 2 条评论 ---
快速开发师你告诉我你多少岁?你说你30岁,你说你25岁?NO,NO,NO 你得主要成分是原子和电子共重100多斤,全部来自宇宙大爆炸之初,你说你多少岁? 2个月前 回复
在下路哥最终还不是硬件等待信号返回,然后释放软件层面的IO阻塞,没毛病吧~ 2个月前 回复

其次,我的理解大概是这样。 wait()和read()是差不多的。操作系统都是以线程调度的,线程正在运行就是active,当wait的时候就是把线程挂起。操作系统不运行这个线程了(当然不在运行的线程状态有很多种,比如睡眠什么的) 自然就阻塞了。等到某个线程notify 这个线程了。自然就active了。所以阻塞跟锁是两码事。锁可以让线程阻塞,锁在最底层无非就是一个标志位,不等到这个标志位变成自己的预期 不往下走,要么死循环等待,要么挂起线程等待别的线程通知你可以获取锁了。但没有锁线程被挂起 也可以阻塞,比如wait()。。

而Socket.read() IO操作 无非就是两台机器的两个不同线程通信了。

 

看源代码

--- 共有 2 条评论 ---
叫我哀木涕 回复 @国栋 : 嗯,没想那么多指的哪个底层;java语言去理解阻塞这个东西稍微太靠上了。应该是看看系统调用的read,这个c程序员肯定理解的更深刻 2个月前 回复
国栋看 java 源代码恐怕是不行的,你追踪下去会发现它们最终依赖 native 的方法,除非你继续去看 jvm 的源代码…… 2个月前 回复

系统的read就是阻塞的呀。要说细节的话,调用read了,系统去指挥硬件IO,等中断,这时候进程是不会被调度的,所以不占用CPU;while (true) 的话因为一直要执行CPU跳转指令,所以是调度的,占用CPU资源。

大兄弟,有想法是好事,但你要搞大事的话,先把计算机科学的基础打打扎实,找些组成原理、操作系统的书看看吧。

--- 共有 1 条评论 ---
快速开发师是不操作,还是主动等待 2个月前 回复
顶部