提交的任务使用spring容器中的资源bean。当由执行程序服务的并发线程访问时,bean线程中的方法是否安全?
答案 0 :(得分:1)
根据定义,它们不是线程安全的。如果你的Spring bean是不可变的,无状态的或正确同步的(99%的情况)它们是线程安全的。以下是一些线程安全的Spring bean的例子:
final
个字段: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();
}
}
synchronized
:public class SynchronizedService {
private int counter;
public synchronized Foo foo() {
return new Foo(counter++);
}
}
AtomicInteger
以避免显式同步(字段为final
,但对象不是):public class AtomicService {
private final AtomicInteger counter = new AtomicInteger();
public Foo foo() {
return new Foo(counter.incrementAndGet());
}
}
请注意,此规则适用于所有用例,不仅适用于在线程池中使用Spring bean的任务。例如,如果您的servlet /控制器使用Spring bean,它们也必须是线程安全的。
答案 1 :(得分:0)
如果您要手动启动访问这些bean的两个线程,那么访问是否是线程安全的呢?执行程序服务没有任何魔力,并且不会更改其线程中运行的代码。如果从两个手动启动的线程访问bean不是线程安全的,那么当代码由Executor管理的线程执行时,它不是线程安全的。