簡體   English   中英

帶有彈簧和繼承的線程安全

[英]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);

}

如果要同時從多個線程中修改SecondClassThirdClass ,則它們將不是線程安全的,因為它們將被實例化為單例。 您可以做的是使變量成為線程安全的。 例如,如果您在數組或集合上進行操作,則使這些線程安全。

如果您不從多個線程修改SecondClassThirdClass字段,我真的看不到問題。 請記住,不建議跟蹤組件內的狀態。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM