从业时间越久,发现互联网很多知识都是错的, 对小白误导有多深?

2022-04-18 22:04:26 +08:00
 jeesk
说说我自己的看法, 无论是 csdn 还是知乎, 在我最开始从业 java 的时候,觉得他们说得没有毛病? 从业几年后,发现很多都是在鬼扯。 就拿 BIO 和 NIO 谁性能好, 知乎上面竞争激烈,下面我粘贴一个知乎的回答。

回答 1:

首先要明确一点:nio 的适用于 io 高并发场景线程开销包括:内存开销(创建一个线程需要为其分配和维护一个 tcb 线程控制块保存上下文,一个线程私有的栈)、线程上下文切换的时间开销(保存上下文,加载下一个线程的上下文),在高并发环境下多出来的这一点点开销积累起来是非常可观的。若使用 bio ,高并发必然引起激烈 contention ,导致大量的上下文切换,若采用一个 io 一个线程模型,一个线程 M 级的空间消耗,内存消耗不起。而 netty 采用 nio 加 selector 加线程池基本上解决了上述问题:一是线程池限制了内存消耗,二是采用 selector 使得只有处于活动状态的 io 才会去占用线程,不会使线程白白因为 io 而阻塞,提高了线程利用率。

说说他们的谬论:
1. 使用 BIO 上下文切换厉害, 如果是相同 4 核 cpu , 无论我是用 bio 还是 nio ,都用 200 个线程, 这个时候对 cpu 的竞争到底有多剧烈? 我个人觉得差不了多少。 所以这个说法是错的。

2. 若采用一个 io 一个线程模型,一个线程 M 级的空间消耗。 这个就更扯淡了。 即使是 tomcat 在 8.5 以前也是 BIO 200 个线程, 都没有用到 1w 个线程? 为什么非要扯开大量线程呢? 并且 tomcat 在 8.5 以后才默认 nio.

3. 一是线程池限制了内存消耗,二是采用 selector 使得只有处于活动状态的 io 才会去占用线程. 那我 tomcat 用 BIO 没有内存限制? 没有内存限制岂不是早就宕机了? 再说说 selector 的问题, 我 NIO 在 readSelector 开 10 个线程去调用 select, 不都是阻塞的吗? 怎么会说在活动状态才占用线程?

然后你会发现这些错误的回答有很多,下面还有大量的小白点赞,觉得说得很对。 但是一经脑子思考就发现, 这绝对是坑 B.

如果有不同意见的小伙伴可以留言,我觉得这个可以作为一个面试题。
16471 次点击
所在节点    Java
152 条回复
Vitta
2022-04-18 23:33:14 +08:00
@jeesk #18 我不一定对,人家也不一定错,没搞过 java ,也可能错的是我。几个栗子:
1. 接口不处理业务逻辑
2. 月经贴,不说 restful 了,接口路径,参数,返回字段随心所欲,有时候接口 A 返回的值要结合接口 B 编历处理
3. 比如一个查询班级人员信息的列表接口,先拿一个接口获取所有 id, 再拿每个 id 去查列表要显示的信息


不是一个 java 这么写了,好多个
charlie21
2022-04-18 23:34:58 +08:00
假秘籍还行
jeesk
2022-04-18 23:46:17 +08:00
chihiro2014
2022-04-19 00:03:30 +08:00
@jeesk 其实你错了,不是你八字不合,而是人家真的是啥也不会。。。在那边瞎吹牛逼,瞎立人设,这才是真相
james122333
2022-04-19 00:04:41 +08:00
@Vitta

1 的话觉得还好 毕竟层层 return 是很麻烦的事情 一个接口也可能很多需求 纯编排基本逻辑并传递下去其实还可以 也很灵活 service 层可以拆的很细
2 3 不说了
jeesk
2022-04-19 00:09:14 +08:00
@chihiro2014 我记得我在知秋群贴了一段代码,问了一个问题, 然后群里就有死粉出来怼我了, 知秋也对我进行攻击, 后来就没有关注过了。 现在我很注重大 v 人品, 能力是其次,没有人品, 再牛也不相信。 徳不配位。
chihiro2014
2022-04-19 00:12:17 +08:00
@jeesk 你又错了。。人家确实是真的没人品。建立的人设都是建立在朋友的情况下,当朋友就恩断义绝的时候,这人已经没了 hhh
Vitta
2022-04-19 00:12:30 +08:00
@james122333 #25 其实 3 就是 1 的延伸。不处理业务逻辑的意思是我都不如直接用个云端数据库
maximum2012
2022-04-19 00:20:10 +08:00
@jeesk 就他还是大 v ,就一个江湖骗子而已。敢正经讨论问题直接攻击你
Jooooooooo
2022-04-19 00:23:27 +08:00
网上关于 volatile 的讨论也几乎都是错的.
james122333
2022-04-19 00:23:46 +08:00
@Vitta

可以这样实现 但我想应该不会有人这样干
levelworm
2022-04-19 01:06:54 +08:00
看来底层的东西的确是难搞啊
james122333
2022-04-19 01:38:34 +08:00
不知道什么纷争也不好讲了
curoky
2022-04-19 01:50:28 +08:00
优化个什么劲啊,堆机器不香吗
chengyiqun
2022-04-19 01:53:21 +08:00
比错误的更讨厌的是, 首页一刷好几个一摸一样, 应该是爬虫互相爬取的, 有时候碰到问题了, 你搜到标题完全符合内容, 结果点开了发现里面什么都没说:(
最后还是得到外网搜谷歌和栈溢出 :)
chengyiqun
2022-04-19 01:54:45 +08:00
这些垃圾站能滚粗搜索引擎嘛, 污染了搜索引擎, 就算用插件屏蔽了, 我碰到最离谱的一次, 是屏蔽后, 搜索第一页一条记录都没有, 第二页就两三条记录还是不相干的 (
medivh
2022-04-19 02:01:16 +08:00
你应该把标题改改,喷 Golang 的异步 IO 那样引战效果更好,反正 V2EX 早就已经是技术饭圈了。

如果你觉得自己不是引战的话,我觉得如果你要探讨 BlockingIO ,至少应该拿出数据来而不是 "我个人觉得差不了多少"。
lifanxi
2022-04-19 02:24:35 +08:00
wtdd
2022-04-19 03:09:05 +08:00
有没有可能:外网知识是对的,只不过全网错了^_^
gtx990
2022-04-19 07:39:45 +08:00
楼上有直接反驳的,我看你也没理他。
你可能没有搞懂一些概念。

nio 就是给 select/epoll 包了一层
如果你写过 C 语言的 server 的话你应该知道编程模型是:
一个主线程 /eventloop/selector 在等待 io ,出现事件以后再执行 callback/起一个线程执行 callback 。
如果你的下游是阻塞的,比如是 jdbc ,你要为 callback 起个线程,那确实符合你的描述。

但是如果你的主要任务是当个网关,你的下游支持异步请求(比如基于 netty client 的 rpc 库 /支持异步的数据库),那么你可以用 completableFuture 的那套东西,不需要让工作线程阻塞在那监听下游。

在这种情况下,200 个同时来的请求,不会产生 200 个同时 block 住,等待下游的线程。

200 这么点,当然你用啥模型都没影响,想让单机并发破千、破万,肯定要死扣每个线程的几兆内存。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/847761

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX