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

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

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

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

11680 次点击
所在节点    程序员
107 条回复
vaaagle
2023-03-09 11:48:19 +08:00
比如,客户让你,将所有的项目一键打包成 excel 然后在生成压缩包最后还得附上一个这些项目的 excel 清单的时候
ps:上面的人不懂拒绝掉,最后分到你手上
buffzty
2023-03-09 11:50:38 +08:00
并发时会用到.
1. 能不用锁就不用锁
2. 锁的越少越好
3. 小心死锁
byte10
2023-03-09 11:50:40 +08:00
真有那么多耗时需求扔消息队列里不就行了么? 那你怎么去消费这些队列呢,你肯定也是用多线程去消费吧。当然一些 mq 可以直接配置多线程的数量。

多线程还是挺讲究的,最小核心数和最大的核心数,还有任务队列 queue 的数量限制,拒绝策略,都是有讲究的,不同场景下是不一样的设置。大多数业务可能触碰不到这部分,只是很多框架都集成这些多线程的设计。
dqzcwxb
2023-03-09 11:57:38 +08:00
现在有一个需求,你要请求 5 个第三方接口进行数据汇总,接口耗时分别为 1s 2s 3s 4s 5s 且无法从第三方获得优化
常规阻塞执行需要 15s 多线程并行执行可以压缩到 5s
把接口换成数据库换成其他服务调用,就是多线程的应用场景
而锁就更简单了,需要保证强一致性 但是为了性能一般只追求最终一致性
CAP:一致性( Consistency )、可用性( Availability )、分区容错性( Partition tolerance )保证 A 和 P 的情况下牺牲 C
MoYi123
2023-03-09 12:31:28 +08:00
web 开发里会下面这个就足够了

lock.acquire()
do sth
lock.release()

会用到什么 2-3 个锁套来套去, cas 之类, 先看看是不是自己的设计有问题.
statumer
2023-03-09 12:33:10 +08:00
@dqzcwxb #24 你说的这个场景是最基础的 map reduce ,调 api 就能实现。
ajaxgoldfish
2023-03-09 12:39:54 +08:00
写 demo 的时候用过一次,多个线程压测拿到结果静态变量+1 ,就用过一次
GraySoul
2023-03-09 13:01:10 +08:00
感谢各位的回复,看完之后我稍微没那么焦虑了。我看面试题后,是真的以为其他程序员写个 web 业务都各种上天花乱坠锁的,就我们业务简单个一比连个多线程都用不到。

最常规的锁,最基本的多线程应用我是熟悉的,啥语言都写过,golang 的 goroutine 啥的也都搞过。对操作系统的进程、线程以及语言级别协程啥的都有基本认知。我问这个问题是真的自己在 web 业务里没用过。

看了大家的回复,我觉得普通的 web 业务应该是用不了太多,但自己写框架或者底层库什么的应该会常用。学了就是自己的,不怕多学,只是对于我面个普通 web 开发要做这些面试题有点点困惑。既然是卷的问题,那也没啥好多说的,高考也是这么过来的的,学起来就是。
rapperx2
2023-03-09 13:28:51 +08:00
我写代码经常就会碰到,跟业务场景有很大关系
GraySoul
2023-03-09 13:29:57 +08:00
@MoYi123 这个确实简单,但我还是没想到啥场景会用。web 开发中常见共享资源就是数据库、中间件这些。他们有各自的锁机制。java 这边共享资源能是啥呢?我难道要在内存里搞个共享的 map ,让不同的请求修改?这怎么想怎么二。。。
GraySoul
2023-03-09 13:31:40 +08:00
@rapperx2 卧槽 求指教 能否举个例子🙇 就像我在 30 楼说的,写 web 业务,共享资源都是数据库、中间件什么的,各有各的锁机制。但 java 这个层面需要锁做啥真的没用过
cloudzhou
2023-03-09 13:36:03 +08:00
如果写中间件,那么多线程就是基本知识了
而一个好的框架,就是让开发者不需要过度考虑并发问题
sbex
2023-03-09 13:43:32 +08:00
以前觉得没啥,但认识了几个 sb 之后发现对于多线程与锁的机制了解这种东西,你可以不知道有多细,但是必须知道有这个东西。

说多了都是泪,跟 sb 相处的日子。
14104chk
2023-03-09 13:44:04 +08:00
想优化,多线程会用得很多
中间件、数据库的锁只能管自身的事情,但如果中间件、数据库的操作要合并在一个事务里,就需要自己去做。JAVA 的锁可以保证单个进程里面的事务隔离性
dqzcwxb
2023-03-09 13:44:11 +08:00
@statumer #26 op 问的不就是基础?什么代码不是调 api?
YepTen
2023-03-09 13:55:42 +08:00
和业务场景深度绑定。
1. 批量下载文件,比如传个 List 参数。一个线程 for 循环那多慢啊。
2. 批量入库,给你一批数据,不能 batchinsert 的时候,for 循环明显不行啊,多线程走起。
3. 一些后台线程等
cloudzhou
2023-03-09 13:56:10 +08:00
@GraySoul 给你一个我最近遇到现实例子:
一个很复杂的工作 job ,对一个对象进行操作,比如同时进行 a 、b 、c 、d 处理
同时之间这些处理逻辑,可能存在依赖关系,比如 a 完全可以独立运行,c 依赖 b 、d 完成之后才运行,等等

要求:
1. 尽量多并发执行,同时避免线程空等待
2. 严格按照依赖关系运行,并发安全
3. 最后有个等待动作,要求所有操作完成,job.wait

如果更高要求:
1. 是否可以中途中断,取消当前 /后续执行
2. 某个操作异常处理如何,是否做到 继续 or 中断
3. 每个处理逻辑,是否可以影响调度过程,比如跳到指定逻辑,或者跳过指定逻辑
4. 有没有最大等待时间
5. 是否可指定等待某个阶段完成就好了,不需要所有都明确完成
6. 防止滥用资源,是否可以控制最大并发数

想想,你要怎么设计
GraySoul
2023-03-09 13:57:40 +08:00
@14104chk 愿意付费咨询,求一个真实场景学习,请你一顿午饭 哈哈哈
cloudzhou
2023-03-09 13:59:53 +08:00
@GraySoul 我这个就真的是真实场景
adoal
2023-03-09 14:04:19 +08:00
用面试排除掉你,录用比你牛叉很多倍的人,但他们干的是你也能干的活,因为从业的人太多了。

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

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

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

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

© 2021 V2EX