JavaサーブレットでThreadLocal<T>を使う時のメモ。実行環境は、GoogleAppEngineです。

そもそも使って大丈夫?

tomcatやGoogleAppEngineでは、実行される際にプールされたスレッドに対して各リクエストを割り当てます。つまり、ThreadLocal<T>を利用しても、各リクエストに対して新しいスレッドが生成されるわけではないので、場合によっては古い内容をThreadLocal<T>が返す可能性があります。

しかし、考え方を変えると「各リクエストは割り当てられたスレッドで完結する」ということなので、新しいリクエストが発生し、サーブレットが起動した時にThreadLocal<T>に値をセットしなおすことで使用しても問題なさそうです。

ただし、スレッドをまたぐような処理を行うと途端にバグとなるので注意が必要です。

そもそもなぜこの疑問が沸いたのかというとSlim3のRequest(Response)Locatorの実装を呼んでいて「これってスレッドセーフなの?」と思ったからです。冷静に考えれば一発で分かることなのに恥ずかしい。

結論

Servletの起動毎にちゃんと初期化(再セット)してあげれば大丈夫。

関連性がある記事

Disqusでコメント