是否有必要在的ThreadFactory使用的AtomicInteger?

先生们:

我认为这是必须使用AtomicInteger的,但的ThreadFactory时,我想证明给我自己,我没有努力。

    new ThreadFactory() {

        private int threadId = 0;   <---- AtomicInteger preferred

        @Override
        public Thread newThread(Runnable r) {
            Thread t = new Thread(r);
            t.setDaemon(true);
            t.setName("my-thread-" + (threadId++));   <--- dangerous code
            return t;
        }
    }

如果有多个请求到来时,线程工厂将生成的线程来处理他们和生成过程中,有可能是在此期间,有间隙的竞争条件可能会潜入英寸

我试着用下面的代码来证明我的理论,但它不是在所有发生的事情2_000核心线程。

@Slf4j
public class ThreadFactoryTest {

    private ConcurrentHashMap<String, Thread> threadIdThreadMap = new ConcurrentHashMap<>();
    private ThreadPoolExecutor myExecutor = new ThreadPoolExecutor(2000, 2000, 30, TimeUnit.SECONDS,
            new ArrayBlockingQueue<>(100000), new ThreadFactory() {

        private int threadId = 0;

        @Override
        public Thread newThread(Runnable r) {
            Thread t = new Thread(r);
            t.setDaemon(true);
            t.setName("my-thread-" + (threadId++));
            if (threadIdThreadMap.contains(t.getName())) {
                log.error("already existed");
                System.err.println(myExecutor);
                myExecutor.shutdownNow();
            } else threadIdThreadMap.put(t.getName(), t);
            return t;
        }
    }, new ThreadPoolExecutor.AbortPolicy());

    @Test
    public void testThreadFactory() throws Exception {
        for (int i = 0; i < 100; ++i) {
            new Thread(() -> runOneHundredJobs()).start();
        }
        Thread.sleep(1000000);
        myExecutor.shutdown();
        myExecutor.awaitTermination(100, TimeUnit.MINUTES);
    }

    private void runOneHundredJobs() {
        log.info("{} starting to submit tasks", Thread.currentThread().getName());
        for (int i = 0; i < 100; ++i) {
            myExecutor.execute(() -> {
                while (100 < System.currentTimeMillis()) {
                    try {
                        Thread.sleep(1000);
                        if (Math.random() > 0.99) break;
                        System.out.println(Thread.currentThread().getName());
                        System.out.println(myExecutor);
                    } catch (Exception e) {

                    }
                }
            } );
        }
    }
}

看起来像一个愚蠢的问题,因为我一直都知道“ 这是很难创建一个多线程竞争条件的差距 ”。

任何帮助/线索可以理解的;)

UPDATE

真的感谢一路走来,@StephenC和@Slaw帮助。我很抱歉,我误会了一些点出现;(

因此,newThread应在执行线程安全的方式,然后在我的情况下,AtomicInteger是必需的。我想有从StephenC报价:

未能表现出竞争条件并不意味着它不存在。

斯蒂芬·C:

是否有必要在的ThreadFactory使用的AtomicInteger?

工厂对象是如何使用这将取决于。

  • 如果您提供了不同的工厂对象的每个实例ThreadPoolExecutor,则执行如何使用它的工厂(实际)并发需求将依赖于。在没有的javadoc语句中,你将需要检查源代码。我没有检查,但我怀疑线程池(包括调用的膨胀newThread)发生一个互斥体。如果我的怀疑是正确的,那么这个用例不需要工厂对象是线程安全的。

    更新 -我现在已经查看过,我怀疑是不正确(用于Java 8和12)。newThread创建一个新的呼叫时作出Worker对象,同时持有互斥锁未完成。因此,你的newThread方法必须是线程安全的在这方面了。

  • 如果一个工厂对象与其他事物(例如,另一个执行人)共享,那么你是正确的:你的newThread方法需要是线程安全的。


我没有看过你的代码,以尽量展现竞争条件,但在我看来,这不是去了解的最佳方式。代码检查和推理是一种更好的方式。未能表现出竞争条件并不意味着它不存在。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我是否需要在synced(anyObject)块中使用AtomicInteger?

来自分类Dev

是否有必要在Java中使用Docker?

来自分类Dev

是否有必要在ArrayList中使用泛型?

来自分类Dev

在使用mongodump创建转储之前,是否有必要在MongoDB中执行fsyncLock?

来自分类Dev

是否有必要在android应用上使用com.google.android.gms.ads.AdActivity?

来自分类Dev

是否有必要在使用String.Format()的DML语句中明确指定单引号?

来自分类Dev

是否有必要在UIView.animateWithDuration(...)的闭包中使用[unown self]?

来自分类Dev

是否有必要在对 CUDA 内核的两次调用之间使用同步?

来自分类Javascript

是否有必要在JS中使用参数向函数添加参数

来自分类Dev

请求获得时是否有必要在laravel控制器中使用htmlspecialchars

来自分类Dev

在分配不同的值之前,是否有必要在指针上使用“删除”?

来自分类Dev

是否有必要在Dart函数内部使用下划线(_)变量?

来自分类Dev

是否真的有必要在 iOS 上的 Firebase 上自定义实现“使用 Apple 登录”?

来自分类Dev

是否有必要在 asp.net mvc 中使用 ASP.NET Identity?

来自分类Dev

是否有必要在每个请求中刷新令牌?

来自分类Dev

是否有必要在 JPanel 上调用 setDoubleBuffered?

来自分类Dev

是否有必要在移动后端重复域驱动设计?

来自分类Java

是否有必要在构造函数中同步块?

来自分类Dev

是否有必要在html的url中编码空格?

来自分类Dev

是否有必要在其定义中装饰类方法?

来自分类Dev

是否有必要在ComponentWillUnmount中卸载状态?

来自分类Dev

是否有必要在Hadoop DataNode上执行任务?

来自分类Dev

是否有必要在每个 addEventListener 之前 removeEventListener?

来自分类Dev

是否有必要在类库中部署XML文件?

来自分类Dev

是否有必要在kubernetes中创建守护程序命令?

来自分类Dev

是否有必要在AJAX超时时中止?

来自分类Dev

是否有必要在图像上标记类的每个对象?

来自分类Dev

是否有必要在 Firebase Cloud Function 中释放内存

来自分类Dev

是否有必要在没有用户输入的情况下对select语句使用预处理语句?

Related 相关文章

  1. 1

    我是否需要在synced(anyObject)块中使用AtomicInteger?

  2. 2

    是否有必要在Java中使用Docker?

  3. 3

    是否有必要在ArrayList中使用泛型?

  4. 4

    在使用mongodump创建转储之前,是否有必要在MongoDB中执行fsyncLock?

  5. 5

    是否有必要在android应用上使用com.google.android.gms.ads.AdActivity?

  6. 6

    是否有必要在使用String.Format()的DML语句中明确指定单引号?

  7. 7

    是否有必要在UIView.animateWithDuration(...)的闭包中使用[unown self]?

  8. 8

    是否有必要在对 CUDA 内核的两次调用之间使用同步?

  9. 9

    是否有必要在JS中使用参数向函数添加参数

  10. 10

    请求获得时是否有必要在laravel控制器中使用htmlspecialchars

  11. 11

    在分配不同的值之前,是否有必要在指针上使用“删除”?

  12. 12

    是否有必要在Dart函数内部使用下划线(_)变量?

  13. 13

    是否真的有必要在 iOS 上的 Firebase 上自定义实现“使用 Apple 登录”?

  14. 14

    是否有必要在 asp.net mvc 中使用 ASP.NET Identity?

  15. 15

    是否有必要在每个请求中刷新令牌?

  16. 16

    是否有必要在 JPanel 上调用 setDoubleBuffered?

  17. 17

    是否有必要在移动后端重复域驱动设计?

  18. 18

    是否有必要在构造函数中同步块?

  19. 19

    是否有必要在html的url中编码空格?

  20. 20

    是否有必要在其定义中装饰类方法?

  21. 21

    是否有必要在ComponentWillUnmount中卸载状态?

  22. 22

    是否有必要在Hadoop DataNode上执行任务?

  23. 23

    是否有必要在每个 addEventListener 之前 removeEventListener?

  24. 24

    是否有必要在类库中部署XML文件?

  25. 25

    是否有必要在kubernetes中创建守护程序命令?

  26. 26

    是否有必要在AJAX超时时中止?

  27. 27

    是否有必要在图像上标记类的每个对象?

  28. 28

    是否有必要在 Firebase Cloud Function 中释放内存

  29. 29

    是否有必要在没有用户输入的情况下对select语句使用预处理语句?

热门标签

归档