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

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

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

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

11744 次点击
所在节点    程序员
107 条回复
TtTtTtT
2023-03-09 14:07:37 +08:00
发生问题:并行处理多个 IO 任务,减少总等待时间
解决方案:加入消息队列
然后,产生了一大堆新的问题:消息队列的高可用和一致性,超时和 session 管理。

就,明明是杀鸡,用 Java 能解决的事情,为啥要用牛刀呢。。
GraySoul
2023-03-09 14:08:16 +08:00
@cloudzhou 费心了,非常感谢,我工作中确实没遇到过这种场景。我有个问题是这个共享的对象具体是什么呢,是内存里的对象?从数据库里取回来的一个大的数据对象?由于很大,所以需要各种线程并发取操作?
hervey0424
2023-03-09 14:08:17 +08:00
@zjsxwc 我感觉平时写的程序和爬虫差不多, 多个线程攻击数据库
cloudzhou
2023-03-09 14:10:39 +08:00
@GraySoul 不是这个对象大,是这个对象上面要填充的数据大,可能触发多个 rpc ,db 等
Biluesgakki
2023-03-09 14:11:41 +08:00
@roundgis 第一次见用“抽插”这个词来形容操作数据库的
apples01
2023-03-09 14:16:27 +08:00
@xiangyuecn 他意思是他自己写过的业务逻辑没有遇到过多线程
yazinnnn
2023-03-09 14:19:14 +08:00
我觉得不会也没关系, 你能找到另外一条赛道来跑赢你的竞争对手就行, 比如用 stm 和结构化并发来处理并发编程
levintrueno
2023-03-09 14:30:40 +08:00
@cloudzhou 感觉,CompletableFuture 蛮符合的
GraySoul
2023-03-09 14:36:49 +08:00
@cloudzhou 噢噢,我大概明白了,这个场景是不是就是假设我有那么一个对象要返回给前端,但是这个对象里面的数据需要从多个数据源那里去获取,而且不同数据源获取到的数据之间有依赖关系,可能先从 A 数据源获取完了个 x ,传给 B 数据源才能获取 y ,等等。这个场景不考虑你说的更高要求,我个人感觉用不着啥锁,因为共享对象里面可以设置多个 key ,获取到不同数据往不同 key 里塞就好了,会涉及到冲突么?但这确实是多线程实践的一个好例子。再次感谢!这里面关于是否涉及对锁的应用,还望不吝赐教!
shakeyo
2023-03-09 14:37:36 +08:00
当前碰到一个网盘场景,刚好发出来看看大佬们的想法
数据库中基于路径枚举以及邻近表的方式存储了一个文件目录结构
当多个用户对某个文件夹以及子文件夹进行操作的时候,可能会导致冲突
例如,用户 a 在 /1/2 文件夹下上传或者移入文件、文件夹
用户 b 同时对 /1 移动或者 rename ,或者删除,此时很显然造成了冲突,如果不做任何处理,用户 a 将碰到部分文件上传失败
简单的思路就是根据路径设计一套读写锁,如果写目录,则把当前文件往上全部加锁,其他操作发现有写锁要么等待,要么友好提示用户稍后再试
hzzh
2023-03-09 14:38:57 +08:00
请教各位大佬,现在到底什么语言不卷,我三年前从 Java 转到 C#,下次换工作本来想提前准备下再找个 Java ,看诸位说的这么卷,那到底提前准备个啥方向会好点
GraySoul
2023-03-09 14:39:19 +08:00
@yazinnnn 学习了,听都没听过= = 其实我的赛道是接项目赚点小钱,感觉那些高大上的都和我不沾边。。。毕竟连并发都没咋写过,基本都靠框架和库就解决了,不知道以后这职业生涯要咋混下去了;)
diagnostics
2023-03-09 14:40:27 +08:00
丢消息队列你也要保证安全发布啊。。。

生产者-消费者是异步了,你考虑过异步转同步的场景没? Thread Leak 考虑过没?

公司业务大了,需求多了,各种问题就有了。

假设你上异步编程,Reactive Programing ,里面的 Operator 如何工作,怎么用的线程清楚了吗?

面试就是筛选你的能力,你的学习能力不能在面试中考核出来,如果可以那么你不会也没关系,因为你学的快。

还搞不清楚,Golang 里面写 Raft 也用到了各种锁,这不是 Java 的问题
cloudzhou
2023-03-09 14:41:04 +08:00
@levintrueno 肯定用 Future ,但是你按照我上面要求写一个,就发现很多小细节,能体现并发掌握如何
cloudzhou
2023-03-09 14:42:05 +08:00
@GraySoul 依赖关系你怎么处理,等待怎么等待
yazinnnn
2023-03-09 14:49:14 +08:00
@GraySoul
并不是高大上, 无锁并发同样属于面试造火箭 工作拧螺丝的范畴, 基本上工作中会
lock.lock
try{

}finally{
lock.release
}

或者
lock.withLock{
}

就够了

stm 是面试唬人的, 工作中不可能让你真写
haython
2023-03-09 14:49:53 +08:00
你肯定是写 php 的
yangzhezjgs
2023-03-09 14:51:15 +08:00
后端并发一般用在中间件里,典型的几个场景:
1.大量客户端同时发送请求,所谓的高并发,这里需要考虑如何处理大量的网络连接,以及处理协议,调用业务逻辑等,需要用到多线程。
2.有状态的应用,典型的是数据库,缓存之类的涉及存储的组件,需要考虑多个用户同时写入发生错误,一般就会用涉及事务,会用到到锁或者 MVCC 之类的技术。
3.也是类似上面的场景,如数据库之类的,会设置定时任务定期让后台线程进行资源回收,备份之类的操作也会涉及多线程。
一般的业务场景中,需要多线程的场景都被框架或者组件内部封装好了,学习的主要目的是使用中间件的时候,理解为什么要这么设计,大多数需要真的写多线程,一般找不到现成的框架,需要真的自己写的时候,但是这种情况太少了
wupher
2023-03-09 14:59:23 +08:00
我自己在工作代码中实际碰到的:

- 多任务调度,一般会结合线程组任务管理和楼主说的锁。(有些任务不允许并行,只能依次或者限量执行)

- 多服务调用,用户 web call ,业务要调 A,B,C,D,E 然后根据不同的返回结果返回相异。顺序调用会超时且用户体验不好,需要异步并发调用。

BTW: 这两种一般碰多了都会组中间件。
tulongtou
2023-03-09 15:00:52 +08:00
@tool2d 用 python ,就一把锁,完全不用考虑(狗头

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

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

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

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

© 2021 V2EX