假设我有以下代码,并且makePool可以被多个线程调用。我正在使用ThreadFactoryBuilder来确保线程具有唯一的名称。
private final ThreadFactory threadFactory = new ThreadFactoryBuilder().setNameFormat(
"MyBusinessClass-%d").build();
public ExecutorService makePool() {
return Executors.newFixedThreadPool(1, threadFactory);
}
或者我必须假设池不是线程安全的,并且必须执行以下操作:
private static final AtomicLong poolCount = new AtomicLong(0L);
public ExecutorService makePool() {
private final ThreadFactory threadFactory = new ThreadFactoryBuilder().setNameFormat(
"MyBusinessClass- " + poolCount.incrementAndGet() + "-%d").build();
return Executors.newFixedThreadPool(1, threadFactory);
}
答案 0 :(得分:1)
我对source code(Guava 10.0.1)的阅读是它是线程安全的,只要支持线程工厂是线程安全的。在您的代码中,后台线程工厂将是Executors.DefaultThreadFactory
的实例,它是线程安全的。
请注意,根据我的看法,这些都不是指定的 ...但是,这些类的编码方式告诉我它们是线程安全的 by设计。相应对象的可变组件由实现为原子的计数器组成,并且线程创建/启动具有发生在之前。