[英]Filter ExecutorService ThreadPool prior to running pending tasks
[英]Tasks submitted to Fixed threadpool ExecutorService are threadsafe?
提交的任務使用來自Spring容器的資源bean。 當由執行程序服務的並發線程訪問時,bean線程中的方法是否安全?
根據定義,它們不是線程安全的。 如果您的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
避免顯式同步(field是final
,但對象不是): public class AtomicService {
private final AtomicInteger counter = new AtomicInteger();
public Foo foo() {
return new Foo(counter.incrementAndGet());
}
}
請注意,此規則適用於所有用例,不僅適用於在線程池中使用Spring Bean的任務。 例如,如果您的servlet /控制器使用Spring bean,那么它們也必須是線程安全的。
如果要手動啟動兩個線程訪問這些bean,那么訪問是否是線程安全的? 執行程序服務無可厚非,並且不會更改其線程中運行的代碼。 如果從兩個手動啟動的線程訪問bean都不是線程安全的,則當代碼由執行程序管理的線程執行時,也不是線程安全的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.