2016-11-25 3 views
1

Angenommen, ich habe den folgenden Code und makePool kann von mehreren Threads aufgerufen werden. Ich verwende ThreadFactoryBuilder, um sicherzustellen, dass die Threads einen eindeutigen Namen haben.Ist die von TheadFactoryBuilder generierte ThreadFactory sicher?

private final ThreadFactory threadFactory = new ThreadFactoryBuilder().setNameFormat(
        "MyBusinessClass-%d").build(); 

public ExecutorService makePool() { 
    return Executors.newFixedThreadPool(1, threadFactory); 
} 

oder muss ich den Pool anzunehmen, ist nicht Thread-sicher, und haben so etwas wie zu tun:

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); 
} 

Antwort

1

Meine Lektüre des source code (Guava 10.0.1) ist, dass es Thread sicher, solange die Rückfadenfabrik fadensicher ist. In Ihrem Code ist die Backing-Thread-Factory eine Instanz von Executors.DefaultThreadFactory, die Thread-sicher ist.

Beachten Sie, dass keines dieser angegeben ist ... soweit ich .. aber sehen kann, ist die Art und Weise, dass diese Klassen codiert sind, sagt mir, dass sie thread-safe nach Design sind. Die veränderbaren Komponenten der jeweiligen Objekte bestehen aus Zählern, die als Atomics implementiert sind, und die Thread-Erzeugung/Start hat eine passiert-vor.

+0

Ich denke nicht, dass ich die Standard-Thread-Factory verwende, wenn ich ein Namensformat zur Verfügung stelle. – joseph

+1

Überprüfen Sie den Quellcode. Ich denke du benutzt es. Das einzige Szenario, in dem Sie die Standard-Thread-Factory nicht verwenden, ist, wenn Sie 'setThreadFactory' im' ThreadFactoryBuilder'-Objekt aufgerufen haben. –

+0

Ich schaute die Quelle auf. Sie verwenden eine atomare Länge für die Zählung und verwenden diese in der anonymen Thread-Factory, die sie zurückgeben, also ist es threadsicher. Fügen Sie diese Referenz zu Ihrer Antwort hinzu: http://grepcode.com/file/repo1.maven.org/maven2/com.google.guava/guava/10.0.1/com/google/common/util/concurrent/ThreadFactoryBuilder. Java # 146 – joseph

Verwandte Themen