以下のシングルスコープスコープのサービスクラスでは、クラス内のすべてのメソッドは、Service.doA()
が呼び出されたときにわかっているユーザーコンテキストを必要とします。メソッド間で情報を渡す代わりに、これらの値をTheadLocal
に格納することを考えていました。このアプローチに関する2つの質問があります:Spring SingletonスコープサービスでThreadLocalを使用する際の質問
1)以下の実装ではThreadLocal
を正しく使用していますか?つまり、スレッドセーフで、正しい値がThreadLocal
に読み書きされますか?
2)メモリリークを防ぐためにThreadLocal userInfo
を明示的にクリーンアップする必要がありますか?それはゴミ収集されますか?
@Service
public class Service {
private static final ThreadLocal<UserInfo> userInfo = new ThreadLocal<>();
public void doA() {
// finds user info
userInfo.set(new UserInfo(userId, name));
doB();
doC();
}
private void doB() {
// needs user info
UserInfo userInfo = userInfo.get();
}
private void doC() {
// needs user info
UserInfo userInfo = userInfo.get();
}
}
シングルトンBeanを使用している場合は、フィールドをインスタンスフィールドにします。 –
@SotiriosDelimanolisしかし、UserInfoインスタンスのフィールドはスレッドセーフではありませんか? – Glide
インスタンスフィールドであるかクラスフィールドであるかにかかわらず、スレッドの安全性については何も変わりません。また、 'UserInfo'フィールドでもなく、' ThreadLocal'フィールドです。 'ThreadLocal'はスレッドセーフです。フィールドは「ファイナル」になります。 –