10

所以我刚刚看到有人尝试ThreadLocal<AtomicInteger>在一些 Java 代码中使用a 。
现在,对于链接代码,这显然是无用的,以及导致请求被拒绝的其他问题。

而且它似乎总是没用AtomicInteger的:(来自 java.util.concurrent.atomic 包)是为多线程访问而设计的,并且ThreadLocal使每个线程都有自己的价值,那么为什么还要使用它呢?

我的问题是:在任何情况下 aThreadLocal<AtomicInteger>有用吗?

4

3 回答 3

6

是的,我们可能会想出一个合理的方案:

  1. AtomicInteger我们需要在每个任务开始时的线程本地实例;
  2. 我们继续将此对象分配给其他几个线程,例如由主任务线程分叉的子线程。

如果不评估出现这种情况的整体背景,我们就无法判断。

于 2013-06-05T07:19:31.417 回答
5

假设我们每个线程都需要一个整数计数器。ThreadLocal 只能处理对象,所以逻辑上我们需要使用一个 int 包装器 - Integer

ThreadLocal<Integer> count = new ThreadLocal<>();
...
count.set(count.get() + 1);

或者我们可以使用 AtomicInteger,不是因为它是线程安全的,而是因为它是可变的

ThreadLocal<AtomicInteger> count = new ThreadLocal<>();
...
count.get().incrementAndGet();

版本 2 的性能比版本 1 好得多,这是一个真正的性能杀手

于 2013-06-05T07:53:09.570 回答
1

我认为只有异国情调的原因ThreadLocal<AtomicInteger>。可能在某些情况下,ThreadLocal不是唯一的引用,AtomicInteger以便更多线程可以访问它。当你发现自己处于这种情况时,我认为你最好仔细看看你的设计......

如果您不需要线程安全性AtomicInteger而只需要它的可变性,我更喜欢使用int[]. 更少的开销然后AtomicInteger与完全控制相结合:

ThreadLocal<int[]> count = new ThreadLocal<>();
...
count.set(new int[1]);
...
count.get()[0] = 42;
...
count.get()[0] += 4711;
于 2013-11-08T09:14:54.120 回答