提交给固定线程池ExecutorService的任务是线程安全的吗?

时间:2012-02-08 11:43:54

标签: java multithreading spring

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

2 个答案:

答案 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管理的线程执行时,它不是线程安全的。

相关问题