根据ThreadLocal
's javadoc,它听起来像是一个特定于线程的容器,用于 1+ 原子字段。
目的是ThreadLocal
表示单个 的所有原子字段Thread
,还是仅在您有多个Atomic*
需要逻辑分组的实例时提供便利容器?
我想我想知道为什么我会想要使用 aThreadLocal
而不是,比如说 an AtomicLong
or AtomicInteger
?提前致谢!
根据ThreadLocal
's javadoc,它听起来像是一个特定于线程的容器,用于 1+ 原子字段。
目的是ThreadLocal
表示单个 的所有原子字段Thread
,还是仅在您有多个Atomic*
需要逻辑分组的实例时提供便利容器?
我想我想知道为什么我会想要使用 aThreadLocal
而不是,比如说 an AtomicLong
or AtomicInteger
?提前致谢!
的目的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
或其他具有内存屏障的原子操作。
我想我想知道为什么我会想要使用 ThreadLocal 而不是 AtomicLong 或 AtomicInteger?
它们服务于完全不同的目的。ThreadLocal
意味着您不必通过授予每个线程自己的对象副本来担心同步。因此,存储在 a 中的对象ThreadLocal
不可能被多个线程访问。
Atomic*
也意味着您不必担心同步,但它们专门用于跨线程共享。