ThreadLocal <atomicinteger>可能有用吗?</atomicinteger>

时间:2013-06-05 07:13:21

标签: java multithreading atomic

所以我只是saw someone try to use一些Java代码中的ThreadLocal<AtomicInteger> 现在,对于链接代码,这显然是无用的,以及导致请求被拒绝的其他问题。

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

我的问题是:是否有ThreadLocal<AtomicInteger>有用的情况?

3 个答案:

答案 0 :(得分:6)

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

  1. 我们需要在每个任务开始时使用AtomicInteger的线程本地实例;
  2. 我们继续在其他几个线程中分发这个对象,例如主任务线程分叉的子线程。
  3. 如果没有评估出现这种情况的全部情况,我们无法判断。

答案 1 :(得分:4)

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

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

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

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

版本2比版本1具有更好的性能,而版本1是真正的性能杀手

答案 2 :(得分: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;
相关问题