在下面的單例作用域服務類中,類中的所有方法都需要調用Service.doA()
時已知的某個用戶上下文。不是在方法中傳遞信息,而是考慮將這些值存儲在TheadLocal
中。我有兩個關於這種方法的問題:有關在Spring單例作用域服務中使用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();
}
}
如果您使用的是singleton bean,只需將該字段設置爲實例字段即可。 –
@SotiriosDelimanolis但是有一個UserInfo實例字段不是線程安全的,不是? – Glide
無論是實例字段還是類字段都不會改變其線程安全性。此外,它不是'UserInfo'字段,它是'ThreadLocal'字段。 'ThreadLocal'是線程安全的。而這個領域將是'最後的'。 –