是由TheadFactoryBuilder线程生成的ThreadFactory安全吗?

时间:2016-11-25 20:17:43

标签: java thread-safety threadpool guava

假设我有以下代码,并且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);
}

1 个答案:

答案 0 :(得分:1)

我对source code(Guava 10.0.1)的阅读是它是线程安全的,只要支持线程工厂是线程安全的。在您的代码中,后台线程工厂将是Executors.DefaultThreadFactory的实例,它是线程安全的。

请注意,根据我的看法,这些都不是指定的 ...但是,这些类的编码方式告诉我它们是线程安全的 by设计。相应对象的可变组件由实现为原子的计数器组成,并且线程创建/启动具有发生在之前。