使用ThreadLocal与Atomic

时间:2012-04-27 20:19:02

标签: java multithreading concurrency

根据ThreadLocal的javadoc,它听起来像是1+原子场的特定于线程的容器。

ThreadLocal的目的是表示单个Thread的所有原子字段,还是只有当您有多个Atomic*个实例需要时才提供便利容器?逻辑上组合在一起?

我想我想知道为什么我会想要使用ThreadLocal而不是AtomicLongAtomicInteger?提前谢谢!

2 个答案:

答案 0 :(得分:8)

ThreadLocal的目的是 not 的字段必须是原子的 - 不需要将它们的值与集中式内存同步。它们是线程本地的,只存在于线程本地存储器中。

  

为什么我会想要使用ThreadLocal而不是AtomicLong或AtomicInteger?

ThreadLocal对于存储某事物的每个线程副本非常有用。例如,遗憾的是SimpleDateFormat不可重入。

private final ThreadLocal<DateFormat> threadLocal =
        new ThreadLocal<DateFormat>() {
    @Override
    protected DateFormat initialValue() {
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSS");
    }
};
...
// get one that is per-thread
DateFormat dateFormat = threadLocal.get();

这是一个有用的模式,因为我们不需要synchronize或担心任何volatile或其他具有内存障碍的原子操作。

答案 1 :(得分:1)

  

我想我想知道为什么我会想要使用ThreadLocal而不是AtomicLong或AtomicInteger?

他们提供完全不同的目的。 ThreadLocal表示您不必担心同步,只需为每个线程授予自己的对象副本即可。因此,存储在ThreadLocal中的对象不可能被多个线程访问。

Atomic*也意味着您不必担心同步,但它们特别适合跨线程共享。