gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 15:34:04 24 4
gpt4 key购买 nike

提交的任务使用来自 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();
}

}

非原子操作是同步的:

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 beans 的任务。例如,如果您的 servlet/ Controller 使用 Spring bean,它们也必须是线程安全的。

关于java - 提交到固定线程池 ExecutorService 的任务是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9192643/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com