小白真诚求问, Java web 开发究竟啥场景需要用到多线程各种天花烂醉锁?

2023-03-09 11:00:54 +08:00
 GraySoul

本人是个啥都会点的多栈开发。 最近在准备面试,看到 java 面试题里考各种并发各种锁,一脸懵逼。 我写了这么多年 web 就没用过多线程,感觉自己属实弱,我单纯地觉得,真有那么多耗时需求扔消息队列里不就行了么?现在 java web 到底都在开发啥玩意,为啥这些都是面试重点呢?

没别的意思,是真不懂。。想问问具体有哪些场景。别的语言的程序员朋友们也欢迎指教,我写其他语言的 web 也没用过。。。我可能就是传说中的 crud 工程师= =

12142 次点击
所在节点    程序员
107 条回复
GraySoul
2023-03-09 19:33:58 +08:00
@tairan2006 (大哭)连接池难道不是直接配置上就完事了么= =HikariCP 什么的,你意思我自己实现一个连接池? 我一个 crud 工程师就这么被你们逼上了开发中间件的悬崖上。。。
GraySoul
2023-03-09 19:35:23 +08:00
@546L5LiK6ZOt 我确实喜欢 vert.x 和 nodejs 的那种 feel ,就审美很一致= =
GraySoul
2023-03-09 19:38:07 +08:00
@NoString “上面的场景通过队列也能解决,但有些场景我们对一致性的要求并不是最终一致,队列带来的消息可靠问题和时延以及剥离事务并不一定适用,因地制宜很关键”

感谢,你这段话是真正的解决了我很大的一个困惑点,可能就是我们浅薄的业务里强一致场景几乎没有。
benzalus
2023-03-09 20:16:14 +08:00
看完帖子,学到不少。多线程自己写很少,用别人写的倒挺多
rehoni
2023-03-09 20:40:37 +08:00
楼主估计跟我一样,一直在做 to b ,难度都在业务上,而非技术上。所以工作上基本对多线程的应用场景根本没有多少需求==,当然多线程还是得学,就当满足自己的好奇心、个人提升,最终实现薪资提升 O(∩_∩)O
wxlwsy
2023-03-09 20:40:38 +08:00
极致压榨 CPU 性能需要多线程.
现在各自框架搞起来显得多线程没啥用,但是本质还是多线程,只是框架替你做了而已.
maigebaoer
2023-03-09 20:49:03 +08:00
重计算的,用多线程和多 CPU 进行并行,比如图片视频处理;重 IO 的,任务关联度又不高,可以用单线程 Async EventLoop ,比如 http 请求
chuck1in
2023-03-09 21:11:56 +08:00
这个其实是看体量的。

如果你的项目业务比较大,用户比较,数据比较多,就很可能会用得上。
甚至写代码的时候必须时时考虑这个问题,不然很容易就出生产事故了。

如果你做的项目一般都是单机跑,功能上能用就行,这些其实就完全用不上。
GraySoul
2023-03-09 21:13:57 +08:00
@rehoni 啊对 你说到点子上了,这么多年过去了,我总感觉我和别人不一样。。。他们都在说什么。。。面试都在面什么啊这是,然后就各种被人鄙视。。。讲道理论聪明才智,我觉得我也没说差很多啊,咋就同样做了这么多年,就我啥都不会呢。。。
hzxxx
2023-03-09 21:44:10 +08:00
@tool2d BIO 不是阻塞 IO 吗? js 是异步 IO 模型,所以不会阻塞
cp19890714
2023-03-09 22:14:32 +08:00
我现在的项目中经常用。如果不会用,就很难发现哪里需要用。
很多人,说起来这些都懂,然而在业务开发中,逻辑都摆到面前了,他也没发现这里有并发问题。原因就是不懂,他所谓的懂,只是知道个皮毛。
tool2d
2023-03-09 22:39:25 +08:00
@hzxxx 我一直没搞明白,为什么网络需要设计成阻塞接口。

非阻塞还能让代码继续干点的事情,一阻塞就什么都做不了了,只能傻等。
leonshaw
2023-03-09 23:11:30 +08:00
@tool2d
阻塞式接口更直观。重点不是等 IO 时让代码做别的事,而是让 CPU 做别的事。理想情况下,线程开销足够小,就可以一直创建线程调用阻塞接口。事件循环到协程的封装也是为了用阻塞式的逻辑写异步代码。
pkupyx
2023-03-09 23:36:49 +08:00
锁的基本原理还是要理解,以及不加锁会出什么问题。
分布式一致性的几种实现方式比锁重要。
鸡架可能需要深入掌握一些小众的锁。
blankmiss
2023-03-10 00:39:20 +08:00
@cloudzhou completefuture 同时干活来填充吗
xuanbg
2023-03-10 06:17:02 +08:00
多线程不见得就要锁,只是多线程读写同一个数据需要锁。不是多线程很多时候也是有锁的,譬如数据库事务就是锁。

多线程是为了充分利用 CPU 时间,而锁则是为了保证数据的一致性。两者并没有什么必然的联系。
Narcissu5
2023-03-10 09:13:06 +08:00
@tool2d 有没有这么一种可能,服务器有多个核
nekoneko
2023-03-10 09:30:50 +08:00
比如说有一些资源, 一些线程会消费资源, 一些线程会添加资源, 消费添加的时候还有一些其他动作, 这时候不加锁你试试.
nekoneko
2023-03-10 09:34:35 +08:00
比如说我有一亿条数据要处理, 每处理 100000 条需要调一个通知方法, 计数器要不要加锁, 调方法要不要加锁.
leaves615
2023-03-10 09:59:23 +08:00
你要求工资 2000 ,绝对没有这么多问题。

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

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

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

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

© 2021 V2EX