【问题标题】:Is the ThreadFactory generated by TheadFactoryBuilder thread safe?TheadFactoryBuilder 线程生成的 ThreadFactory 是否安全?
【发布时间】:2017-04-10 06:09:43
【问题描述】:

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

【问题讨论】:

    标签: java thread-safety threadpool guava


    【解决方案1】:

    我对@9​​87654321@(Guava 10.0.1)的解读是它是线程安全的,只要支持线程工厂是线程安全的。在您的代码中,支持线程工厂将是 Executors.DefaultThreadFactory 的一个实例,它是线程安全的。

    请注意,这些都不是指定的 ...据我所知。但是,这些类的编码方式告诉我它们是线程安全的设计。各个对象的可变组件由实现为原子的计数器组成,线程创建/启动有一个 happens-before

    【讨论】:

    • 如果我提供名称格式,我认为我没有使用默认线程工厂。
    • 查看源代码。我想你正在使用它。唯一不使用默认线程工厂的情况是,如果您在 ThreadFactoryBuilder 对象上调用了 setThreadFactory
    • 我查了源码。他们使用原子长作为计数,并在他们返回的匿名线程工厂中使用它,所以它是线程安全的。请将此参考添加到您的答案中:grepcode.com/file/repo1.maven.org/maven2/com.google.guava/guava/…
    • @Joseph - 我的答案已经链接到源代码。看到短语“源代码”上的超链接了吗?
    • 我看到确实如此。添加可能是错误的词。我的意思是更换。我的链接直接指向 .build() 方法。
    猜你喜欢
    • 2010-11-11
    • 2015-09-29
    • 2011-08-24
    • 2012-08-21
    • 2016-11-14
    • 1970-01-01
    • 2019-09-22
    相关资源
    最近更新 更多