Java 提交到Fixed threadpool ExecutorService的任务是否线程安全?

Java 提交到Fixed threadpool ExecutorService的任务是否线程安全?,java,multithreading,spring,Java,Multithreading,Spring,提交的任务使用spring容器中的资源bean。当被执行器服务的并发线程访问时,bean中的方法是线程安全的吗?根据定义,它们不是线程安全的。如果您的Springbean是不可变的、无状态的或正确同步的(99%的情况),那么它们是线程安全的。下面是几个线程安全的SpringBean示例: 仅限final字段: 字段仅在创建过程中修改,实际上是最终的: 无状态,典型实用程序类别: 非原子操作是同步的: AtomicInteger以避免显式同步(字段为final,但对象不是): 请注意,此规则适用于

提交的任务使用spring容器中的资源bean。当被执行器服务的并发线程访问时,bean中的方法是线程安全的吗?

根据定义,它们不是线程安全的。如果您的Springbean是不可变的、无状态的或正确同步的(99%的情况),那么它们是线程安全的。下面是几个线程安全的SpringBean示例:

仅限
final
字段: 字段仅在创建过程中修改,实际上是最终的: 无状态,典型实用程序类别: 非原子操作是同步的:
AtomicInteger
以避免显式同步(字段为
final
,但对象不是):
请注意,此规则适用于所有用例,而不仅仅适用于线程池中使用Springbean的任务。例如,如果您的servlet/控制器使用SpringBean,那么它们也必须是线程安全的。

如果手动启动两个线程访问这些Bean,那么访问是否是线程安全的?executor服务没有魔力,也不会改变线程中运行的代码。如果从两个手动启动的线程访问bean不是线程安全的,那么当代码由一个执行者管理的线程执行时也不是线程安全的。

您的意思是多个任务可以引用同一个资源bean吗?在这种情况下,这取决于这些bean本身是否线程安全,而不是它们是如何使用的。你告诉我们,它们是你的bean。我们怎么知道?
public class ImmutableService {

    private final Dependency dep;

    @Autowired
    public StatelessService(Dependency dep) {
        this.dep = dep;
    }

    public Foo foo() {
        return dep.foo();
    }

}
public class EffectivelyImmutableService {

    @Autowired
    private final Dependency dep;

    public Foo foo() {
        return dep.foo();
    }

}
public class StatelessService {

    public Foo foo() {
        return new Foo();
    }

}
public class SynchronizedService {

    private int counter;

    public synchronized Foo foo() {
        return new Foo(counter++);
    }

}
public class AtomicService {

    private final AtomicInteger counter = new AtomicInteger();

    public Foo foo() {
        return new Foo(counter.incrementAndGet());
    }

}