Lambda表达式多线程中出现错误

时间:2021-04-05 19:12:00
今天做项目的时候遇到的,有一个函数取一个Object为参数,然后这个函数里面声明了一个Runnable,这个Runnable也用到了参数object,大概的代码如下

public void testFunction(Object obj) {
  Runnable runnable = () -> {使用obj参数做一些操作}
  TaskService.execute(runnable);
  return ;
}

现在有个问题,如果在短时间内多次call这个函数,每次传入的obj参数都不同,可能会出现每个runnable中使用的object都是最后一次调用函数时传的参数,请问这种现象有没有个特定的名字,百度了一顿没有搜到,有没有什么方法解决呢?

5 个解决方案

#1


闭包延迟绑定,obj是引用,线程异步处理的时候就可能是最后一个。可以把obj做复制,参数传递到lambda,互不干扰

#2


你确定每次传入的object是不一样的吗?

#3


Lambda表达式多线程中出现错误

#4


引用 2 楼 lwb314 的回复:
你确定每次传入的object是不一样的吗?


是的。。。其实就是给不同的用户发消息,但是如果短时间内收到多条请求,可能就只会以最后一次为准

#5


引用 1 楼 oyljerry 的回复:
闭包延迟绑定,obj是引用,线程异步处理的时候就可能是最后一个。可以把obj做复制,参数传递到lambda,互不干扰

好的 我去试一下,谢谢!

#1


闭包延迟绑定,obj是引用,线程异步处理的时候就可能是最后一个。可以把obj做复制,参数传递到lambda,互不干扰

#2


你确定每次传入的object是不一样的吗?

#3


Lambda表达式多线程中出现错误

#4


引用 2 楼 lwb314 的回复:
你确定每次传入的object是不一样的吗?


是的。。。其实就是给不同的用户发消息,但是如果短时间内收到多条请求,可能就只会以最后一次为准

#5


引用 1 楼 oyljerry 的回复:
闭包延迟绑定,obj是引用,线程异步处理的时候就可能是最后一个。可以把obj做复制,参数传递到lambda,互不干扰

好的 我去试一下,谢谢!