2016-11-25 141 views
1

假设我有以下代码,makePool可以被多个线程调用。我正在使用ThreadFactoryBuilder以确保线程具有唯一的名称。TheadFactoryBuilder线程安全生成的ThreadFactory是否安全?

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

我的source code(番石榴10.0.1)的解读是,它是线程安全,只要背衬线工厂是线程安全的。在你的代码中,后台线程工厂将是线程安全的Executors.DefaultThreadFactory的一个实例。那没有的,这是指定 ...

注意,据我所看到的。但是,这些类编码的方式对我说,他们是线程安全的设计。各个对象的可变组件包括以atomics形式实现的计数器,并且线程创建/启动具有发生在之前。

+0

如果我提供名称格式,我不认为我使用的是默认线程工厂。 – joseph

+1

检查源代码。我想你正在使用它。只有在ThreadFactoryBuilder对象上调用'setThreadFactory'时,才会使用默认线程工厂。 –

+0

我抬起头来。他们使用一个长计数的原子并在返回的匿名线程工厂中使用它,因此它是线程安全的。请将此参考添加到您的答案中:http://grepcode.com/file/repo1.maven.org/maven2/com.google.guava/guava/10.0.1/com/google/common/util/concurrent/ThreadFactoryBuilder。 java#146 – joseph