Java 使用ThreadLocal vs Atomic

Java 使用ThreadLocal vs Atomic,java,multithreading,concurrency,Java,Multithreading,Concurrency,根据ThreadLocal的javadoc,它听起来像是1+原子字段的线程特定容器 ThreadLocal的目的是表示单个Thread的所有原子字段,还是当您有多个需要逻辑分组在一起的atomic*实例时,仅提供一个方便的容器 我想我想知道为什么我会想使用ThreadLocal而不是AtomicLong或AtomicInteger?提前谢谢 ThreadLocal的目的是字段不必是原子的——不需要将其值与集中式内存同步。它们是线程本地的,只存在于线程本地内存存储中 为什么我要使用ThreadLo

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

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


我想我想知道为什么我会想使用
ThreadLocal
而不是
AtomicLong
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();
private final ThreadLocal ThreadLocal=
新ThreadLocal(){
@凌驾
受保护的日期格式初始值(){
返回新的SimpleDataFormat(“yyyy-MM-dd HH:MM:ss.SSSS”);
}
};
...
//每个线程获取一个
DateFormat DateFormat=threadLocal.get();
这是一个有用的模式,因为这样我们就不必对其进行
同步
,也不必担心任何
易失性
或其他具有内存障碍的原子操作

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

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


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

谢谢@Gray!所以,如果我的类不是不可变的,我需要在它们的实例上进行同步,但不想进入所有的java.util.concurrent.*“stuff”,我可以用
ThreadLocal
保护它们……这是一个公平的总结吗?!?是@herpylderp(非常好的用户名btw),只要它们只能是线程本地的。线程完成后,可以对其所有
ThreadLocal
类进行GC。不可变类和不可重入类——尽管非rentrant类根据定义可能不是不可变的。如果在别处发布其引用,则可以从其他线程访问存储在
ThreadLocal
中的对象。更重要的是,
AtomicReference
并没有消除对其引用的对象进行同步的需要。它只提供线程间引用的安全发布。将
ArrayList
粘贴到
AtomicReference
中不会使
ArrayList
本身线程安全。