Java中在使用多线程时方法加Lock的问题? 5C

Java中在使用多线程时,调用的方法计算比较复杂。为了避免线程之间数据混乱,使用了Lock,但是这就导致失去了多线程应该有效果,有什么方法能够解决吗?

10个回答

尽量减少Lock的范围,尽量早UnLock,比如只在需要共享的数据之间Lock,这样其他地方可以实现多线程的并行。或者就是把数据尽量拆分开,不共享

LWJ285149763
LZS2851 我在fork/join中的compute里,引用了部分的static方法,这个会不会是造成数据共享的原因呢?
接近 2 年之前 回复
LWJ285149763
LZS2851 我定义的是局部变量,不存在共享的问题吧?
接近 2 年之前 回复
LWJ285149763
LZS2851 我是在使用fork/join时遇到问题的,因为在compute中进行计算的方式比较复杂,所以出现的问题
接近 2 年之前 回复
LWJ285149763
LZS2851 主要是无法拆开
接近 2 年之前 回复

多线程加锁的话,你就变成了单线程写入操作了吧,那样多线程就没有什么意义了,一般如果是求和之类的,用原子加减之类的方法,就能避免并发冲突的情况。你可以找一下原子加之类的方法

LWJ285149763
LZS2851 我试试
接近 2 年之前 回复

这就要看Lock的颗粒度范围了,如果你是对整个处理进行同步阻塞,那对这一整个处理而言就失去了并行的意义;
但你可以只针对共享资源相关的部分处理进行Lock,这样还是可以达到提高效率的目的的。

Elephant3G
Elephant3G 回复LWJ285149763: 如果不涉及竞争性共享资源的访问,那完全没有必要使用排他处理哦
接近 2 年之前 回复
LWJ285149763
LZS2851 主要是,我的方法里,定义的都是局部变量,不存在共享变量的问题!
接近 2 年之前 回复

看你的计算是什么样子的,如果是for循环,可以分开执行,0,2,4,。。。;1,3,5.。。这样分组,不同线程执行不同的索引组,然后再合并一起。

LWJ285149763
LZS2851 这么简单的加减我试过,没有问题,但是在线程中执行复杂的计算时,就会出现问题
接近 2 年之前 回复

你要多线程还要加锁本来就是自相矛盾的,还是要分析一下具体的计算,看哪些部分可以分别计算,需要汇总的时候可以回到主线程。

LWJ285149763
LZS2851 我试试吧
接近 2 年之前 回复

部署多个服务,实现并行

m0_37729339
m0_37729339 回复LWJ285149763: spring-cloud 分布式部署的框架,不过你如果部署多个服务的话本身就是分布式的了
接近 2 年之前 回复
LWJ285149763
LZS2851 有什么好用的框架吗?分布式计算的,而且还要计算结果能够在计算完成之后直接返回给我的前端
接近 2 年之前 回复

你的需求是自相矛盾的!最好能把你要算的东西拿出来让大家一起分析一下看看能不能并行处理。
单线程处理的东西强制分成多线程然后再用lock同步,这效率反而比单线程更低。

一般 不是用同步关键字吗?

LWJ285149763
LZS2851 有时候,同步关键字不管用处
接近 2 年之前 回复

对于多线程操作来说,原子操作是最合适的

尽量使用多线程容器
对于耗时时间别人长的业务逻辑,采用加锁的方式
对于耗时时间短的,采用ato原子类方式

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问