前提
pythonのコードでは関数外のコードは一度しか実行されないという記事を目にしたのでJavaのStaticについても同じ挙動なのか気になり検証した
検証
public class Cache {
private static Integer number = null;
public Cache(){}
public int get(){
if(number != null){
number++;
return number;
} else {
number = 0;
return number;
}
}
}
var cache = new Cache();
logger.info("1回目の呼び出し cacheの番号: " + cache.get());
logger.info("2回目の呼び出し cacheの番号: " + cache.get());
上記のようにcacheクラスを用意してハンドラー関数内でインスタンス生成とgetメソッドのコールを行う。getメソッドではstaticに入れた内容を記録しておき、+1した値を返す。Nullの場合は0を入れて返す。
実行してみると、下記画像のようになった
つまり、staticがnullで0を入れるのはColodスタートした際の1回のみだった。
結論
- staticのライフサイクルはLambdaが終了しても継続した値になる
- 実行環境が終了するまで(warmスタート状態が終わるまで)staticの値は継続する
参考
Operating Lambda: パフォーマンスの最適化 – Part 1
https://aws.amazon.com/jp/blogs/news/operating-lambda-performance-optimization-part-1/