スレッドセーフ便覧
ライブラリ別にみたスレッドセーフ
初期化に時間かかったり、内部にプールやキャッシュを持つものは、スレッドセーフなしくみが大抵備わっていて、それを使わないと性能が出なかったりするので、ドキュメントをよく読んで対応する。
Serializer
JAXBやJacksonのようなオブジェクトシリアライザは、クラスのメタデータ解析が最初に実行されるので初期化が遅い。そのため大抵使い回せるようにスレッドセーフな設計になっている。
Jackson ObjectMapper
オブジェクトの読み書きはスレッドセーフであり、頻繁にObjectMapperのインスタンスを作ることは避ける。
ObjectMapperの設定はスレッドセーフではないので、生成箇所がマルチスレッドにならないように設計する。
Http Client
Apache HttpClient
3.x系ではThreadSafeClientConnManager を使とスレッドセーフにできる。4.x系ではPoolingHttpClientConnectionManagerに置き換わり、HttpClientBuilderから生成されるデフォルトも、PoolingHttpClientConnectionManagerを使うことになっているのでスレッドセーフである。
過去バージョンのHttpClientのクローズ処理は間違いやすかったが、4.x系はresponseとhttpclientインスタンスをそれぞれcloseすればよい。
OkHttp
OkHttpのクライアントはスレッドセーフである。コネクションプールを内部に持っているので、インスタンス間で共有した方がよい。
古典的なスレッドアンセーフ
SimpleDateFormat