[英]Thread Safety with Spring and Inheritance
我對線程安全如何影響這種情況感到好奇。
假設我有兩個類,驗證類,一個繼承另一個。 第一個是簡單的java類,不是由Spring管理的,第二個繼承了第一個,並且是spring組件。
public class FirstClass {
private String[] supportedApps;
public FirstClass(final String[] supportedApps){
this.supportedApps = supportedApps;
}
private boolean isSupported(final String app){
return .....;
}
那么我們有第二個繼承這個類的類,那就是Spring托管的bean。
@Component
public class SecondClass extends FirstClass{
@Autowired
public SecondClass(@Value("${supported.apps} String[] supportedApps) {
super(supportedApps)
this.supportedApps = supportedApps;
}
other validations methods..
}
它還預期將有ThirdClass,也以與SecondClass相同的方式擴展FirstClass。
我傾向於說這種模式不是線程安全的。 但是,如果FirstClass否則是無狀態的。 我可以期望在context create上創建SecondClass的單例一次設置繼承嗎? 那個可變的數組不會改變嗎?
更新:
我們確實在FirstClass中將靜態變量實例化為immutableSets和靜態方法。
FirstClass中的操作可能是:
public boolean isValidApp(final String app) {
final List<String> apps = Arrays.asList(supportedApplications);
return apps.contains(app);
}
如果要同時從多個線程中修改SecondClass
和ThirdClass
,則它們將不是線程安全的,因為它們將被實例化為單例。 您可以做的是使變量成為線程安全的。 例如,如果您在數組或集合上進行操作,則使這些線程安全。
如果您不從多個線程修改SecondClass
和ThirdClass
字段,我真的看不到問題。 請記住,不建議跟蹤組件內的狀態。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.