众所周知,AWS Lambda可能会重复使用已创建的处理程序对象,并且它确实这样做(请参见FAQ):
问: AWS Lambda是否会重复使用函数实例?
为了提高性能,AWS Lambda可能选择保留您的函数的实例并将其重用以服务后续请求,而不是创建新副本。 您的代码不应该假定这总是会发生。
问题涉及Java
并发。 如果我有一个处理程序类,比如:
public class MyHandler {
private Foo foo;
public void handler(Map<String,String> request, Context context) {
...
}
}
因此,在这里访问和处理对象变量 foo
是否是线程安全的呢?
换句话说:AWS Lambda 可以同时为不同的调用使用相同的对象吗?
编辑 我的函数在事件驱动源上进行处理,特别是由 API 网关方法调用。
编辑-2 此类问题出现在你想要实现对外部资源的连接池时,因此我希望将连接保持为对象变量。它确实按预期工作,但我担心并发问题。
编辑-3 更具体地说,我想知道:AWS lambda 的处理程序实例是否可以共享公共堆(内存)?我必须指定此附加详细信息,以防止回答列出关于 Java 线程安全对象的显而易见和常见的事情。