2016-11-25 97 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