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

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

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

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

12333 次点击
所在节点    程序员
107 条回复
xhldtc
2023-03-09 11:10:19 +08:00
面试造火箭呗,你可以没用过,但是你得懂。面试的时候两个人都没有用过,你懂他不懂,你说招哪个人?大环境太卷没办法
zjsxwc
2023-03-09 11:15:03 +08:00
爬虫,用线程开 n 个连接“攻击”同一个服务器接口。2333
FawkesV
2023-03-09 11:22:14 +08:00
我们这边有这样子的场景:可能存在大批量数据查询的时候,按数据量拆分多线程查询。
例如有一个接口需要查询指定的 ID 数据信息,需要查询到数据中台。可能最多存在 1000 个 ID 。就拆分每次查询 20 个,使用线程池查询,再将数据组装在一起。
li746224
2023-03-09 11:23:48 +08:00
api 服务算 java web 吗?如果算的话,我开发过的里面好像就通知服务和生成报表的服务用到了多线程。
xiangyuecn
2023-03-09 11:24:03 +08:00
???
???

http 请求本身就是多线程,不是啥都会点,你这是啥也不会
crysislinux
2023-03-09 11:24:54 +08:00
web 开发感觉 Java 进程层面的锁不太用的上,除非你设计的就是单机程序,否则就是用分布式锁或者数据库层面的锁了。
tool2d
2023-03-09 11:25:58 +08:00
"我写了这么多年 web 就没用过多线程",前端的 web worker 就是多线程啊,而且不用上锁,都是用 json 消息在线程之间传输数据的。

别说 java ,任何语言锁多了后,维护都很复杂。
roundgis
2023-03-09 11:26:48 +08:00
只是抽插數據庫那基本上用不上
tool2d
2023-03-09 11:28:16 +08:00
@xiangyuecn "http 请求本身就是多线程,不是啥都会点,你这是啥也不会'

http 请求可以不开线程的,网络请求本来就是非阻塞 IO ,不会阻挡后面代码正常执行。比如 nodejs 就是单线程。
GraySoul
2023-03-09 11:31:27 +08:00
@crysislinux @tool2d 我说的没用过多线程是指:在 web 场景直接使用各种锁来对共享数据做并发处理。

原理上的多线程我懂,以及在数据库层面 web 框架层面的多线程应用我也大体都了解,我显然不是指这些底层场景。。

@xiangyuecn 没错我啥都不会,感谢批评
pierswu
2023-03-09 11:31:52 +08:00
这是在考察逻辑能力
GraySoul
2023-03-09 11:34:28 +08:00
@FawkesV 非常感谢提供具体场景,不过类似这样的场景我感觉就是不太涉及共享数据的冲突,完全就是开完线程之后把各自的结果一归拢,确实用不上面试上那些玩意。
rqxiao
2023-03-09 11:34:28 +08:00
多线程:线程池处理大批量需要 io 的任务 ;分布式锁:mq 消费幂等性,下单减库存的线程安全
GraySoul
2023-03-09 11:35:27 +08:00
@roundgis 好一个抽插,这是能播的么
libook
2023-03-09 11:37:24 +08:00
面试是测试你水平上限的,所以肯定要问一些面试官认为代表水平上限的问题,只问 CRUD 谁都会,一百份简历只要 5 个人怎么办。

知己知彼百战不殆,你只有摸清楚了面试官的思路,才能更好拿捏面试。
ljrdxs
2023-03-09 11:40:45 +08:00
“真有那么多耗时需求扔消息队列里不就行了么?”

公司里应该真是这样的。
1 楼正解。面试造火箭。
GraySoul
2023-03-09 11:41:00 +08:00
@tool2d @xiangyuecn 可能指的是 web 容器针对每个请求都会建一个线程来处理。他要是说的是发起 http 请求,那到底谁不懂还真是个问题。。
hhjswf
2023-03-09 11:45:26 +08:00
消息队列不用买啊?你说用开源自建,那也要部署一套占用资源。能用 Java 解决你不用,再引入一个中间件依赖,这很好吗?
xinhochen
2023-03-09 11:46:45 +08:00
说一个场景:用户在页面订阅由 websocket 推送的数据,关闭页面后需要移除订阅关系。当用户打开多个页面或者不同客户端使用,对于这个订阅关系的维护就用到了锁。当然,这个锁可能是提前实现好的组件内部使用的,开发者可以不用关心。
bugmakerxs
2023-03-09 11:47:33 +08:00
1. 避免程序启动时环境初始化方法被调用多次
2. 请求方超发导致消费者并发消费同一条消息
3. 多并行任务全部结束后执行另一个任务

用到的地方确实不多,不过确实有点用

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

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

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

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

© 2021 V2EX