4

根据ThreadLocal's javadoc,它听起来像是一个特定于线程的容器,用于 1+ 原子字段。

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

我想我想知道为什么我会想要使用 aThreadLocal而不是,比如说 an AtomicLongor AtomicInteger?提前致谢!

4

2 回答 2

8

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

为什么我要使用 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或其他具有内存屏障的原子操作。

于 2012-04-27T20:20:38.610 回答
2

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

它们服务于完全不同的目的。ThreadLocal意味着您不必通过授予每个线程自己的对象副本来担心同步。因此,存储在 a 中的对象ThreadLocal不可能被多个线程访问。

Atomic*也意味着您不必担心同步,但它们专门用于跨线程共享。

于 2012-04-27T20:23:21.197 回答