AWS Lambda调用期间是否保留字段值?Java实例复用疑问
问题解答
原代码场景分析
给定Java Lambda处理类(注:原代码返回值类型int需改为Integer,因RequestHandler泛型参数要求为引用类型):
public class HandlerClass implements RequestHandler<DynamodbEvent, Integer> { int i = 0; public HandlerClass() {} public Integer handleRequest(DynamodbEvent dynamodbEvent, Context context) { i = i + 1; System.out.println(i); return i; } }
事件B触发时的行为(非static变量i)
事件B会复用同一个HandlerClass实例,打印2。
Lambda的执行机制是:首次请求(事件A)触发时,会创建执行容器并初始化HandlerClass实例;若容器在请求处理完成后未超时销毁,后续请求(事件B)会直接复用该容器,同时复用已创建的HandlerClass实例。因此成员变量i会保留事件A处理后的取值(1),执行i = i + 1后变为2,最终打印2。
当i定义为static时的行为
如果将i改为static int i = 0;,事件B触发时依然会打印2。
static变量属于类级别,所有该类的实例共享同一值。事件A处理后static变量i变为1,事件B触发时,无论复用原有实例还是创建新实例(超时前复用实例的概率更高),static变量都会基于之前的取值累加为2,最终打印2。
内容的提问来源于stack exchange,提问作者Milo
相关产品推荐
相关产品推荐

