簡體   English   中英

提交給固定線程池ExecutorService的任務是線程安全的嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM