根据ThreadLocal
的javadoc,它听起来像是1+原子场的特定于线程的容器。
ThreadLocal
的目的是表示单个Thread
的所有原子字段,还是只有当您有多个Atomic*
个实例需要时才提供便利容器?逻辑上组合在一起?
我想我想知道为什么我会想要使用ThreadLocal
而不是AtomicLong
或AtomicInteger
?提前谢谢!
答案 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*
也意味着您不必担心同步,但它们特别适合跨线程共享。