所以我只是saw someone try to use一些Java代码中的ThreadLocal<AtomicInteger>
现在,对于链接代码,这显然是无用的,以及导致请求被拒绝的其他问题。
似乎总是没用的:AtomicInteger
(来自java.util.concurrent.atomic包)是为多线程访问而设计的,ThreadLocal
使每个线程都有自己的值,那么为什么要使用呢?
我的问题是:是否有ThreadLocal<AtomicInteger>
有用的情况?
答案 0 :(得分:6)
是的,我们可能会提出一个合理的方案:
AtomicInteger
的线程本地实例; 如果没有评估出现这种情况的全部情况,我们无法判断。
答案 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;