TheadFactoryBuilder线程生成的ThreadFactory安全吗?
Is the ThreadFactory generated by TheadFactoryBuilder thread safe?
假设我有如下代码,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);
}
我对 source code (Guava 10.0.1) 的解读是它是线程安全的,只要后备线程工厂是线程安全的。在您的代码中,支持线程工厂将是线程安全的 Executors.DefaultThreadFactory
的实例。
请注意,none 是 指定的 ... 据我所知。但是,这些 类 的编码方式对我说它们是线程安全的设计。各个对象的可变组件由作为原子实现的计数器组成,线程创建/启动具有 happens-before.
假设我有如下代码,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);
}
我对 source code (Guava 10.0.1) 的解读是它是线程安全的,只要后备线程工厂是线程安全的。在您的代码中,支持线程工厂将是线程安全的 Executors.DefaultThreadFactory
的实例。
请注意,none 是 指定的 ... 据我所知。但是,这些 类 的编码方式对我说它们是线程安全的设计。各个对象的可变组件由作为原子实现的计数器组成,线程创建/启动具有 happens-before.