我很好奇线程安全在这种情况下是如何发挥作用的。
假设我有两个类,验证类,一个继承另一个。第一个是一个简单的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 是无状态的。我可以期望在上下文创建时单例创建 SecondClass 来设置继承一次吗?那个数组是可变的,不能改变?
更新:
我们确实在 FirstClass 中有实例化为 immutableSet 的静态变量和静态方法。
FirstClass 中的操作可能是:
public boolean isValidApp(final String app) {
final List<String> apps = Arrays.asList(supportedApplications);
return apps.contains(app);
}
最佳答案
如果您要从多个线程修改 SecondClass
和 ThirdClass
,那么它们将不是线程安全的,因为它们将被实例化为单例。您可以做的就是使变量成为线程安全的。例如,如果您正在操作数组或集合,请使它们成为线程安全的。
如果您不从多个线程修改 SecondClass
和 ThirdClass
的字段,我真的看不出问题。请记住,不建议跟踪组件内的状态。
关于java - Spring 和继承的线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49407128/