java - Spring 和继承的线程安全

标签 java spring inheritance thread-safety

我很好奇线程安全在这种情况下是如何发挥作用的。

假设我有两个类,验证类,一个继承另一个。第一个是一个简单的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);

}

最佳答案

如果您要从多个线程修改 SecondClassThirdClass,那么它们将不是线程安全的,因为它们将被实例化为单例。您可以做的就是使变量成为线程安全的。例如,如果您正在操作数组或集合,请使它们成为线程安全的。

如果您不从多个线程修改 SecondClassThirdClass 的字段,我真的看不出问题。请记住,不建议跟踪组件内的状态。

关于java - Spring 和继承的线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49407128/

相关文章:

java - 如何使用 '@Qualifier'动态指定参数?

java - Android应用程序不显示解析的Jsoup信息

spring - 如何在 Spring Data REST 投影中有条件地公开数据?

java - 适用于 PostgreSQL 的 Spring Batch StoredProcedureItemReader - java.lang.IllegalStateException

java - Java中的方法有 'new'修饰符吗?

java - 涉及多个类的接口(interface)隔离原则 - 如何正确设计?

java - JPA 枚举类型作为数据库中的表

css - 使用 Twitter bootstrap + Spring 在表单字段中插入意外的 "+"

java - JPA UML 继承重叠

Ruby、类和继承