スレッドセーフ便覧
#WIP
ライブラリ別にみたスレッドセーフ
初期化に時間かかったり、内部にプールやキャッシュを持つものは、スレッドセーフなしくみが大抵備わっていて、それを使わないと性能が出なかったりするので、ドキュメントをよく読んで対応する。
Serializer
JAXBやJacksonのようなオブジェクトシリアライザは、クラスのメタデータ解析が最初に実行されるので初期化が遅い。そのため大抵使い回せるようにスレッドセーフな設計になっている。
Jackson ObjectMapper
https://stackoverflow.com/questions/3907929/should-i-declare-jacksons-objectmapper-as-a-static-field
オブジェクトの読み書きはスレッドセーフであり、頻繁にObjectMapperのインスタンスを作ることは避ける。
ObjectMapperの設定はスレッドセーフではないので、生成箇所がマルチスレッドにならないように設計する。
Http Client
Apache HttpClient
3.x系ではThreadSafeClientConnManager を使とスレッドセーフにできる。4.x系ではPoolingHttpClientConnectionManagerに置き換わり、HttpClientBuilderから生成されるデフォルトも、PoolingHttpClientConnectionManagerを使うことになっているのでスレッドセーフである。
過去バージョンのHttpClientのクローズ処理は間違いやすかったが、4.x系はresponseとhttpclientインスタンスをそれぞれcloseすればよい。
https://hc.apache.org/httpcomponents-client-ga/httpclient/examples/org/apache/http/examples/client/ClientConnectionRelease.java
OkHttp
OkHttpのクライアントはスレッドセーフである。コネクションプールを内部に持っているので、インスタンス間で共有した方がよい。
https://stackoverflow.com/questions/48532860/is-it-thread-safe-to-make-calls-to-okhttpclient-in-parallel
古典的なスレッドアンセーフ
SimpleDateFormat