Java Volatile是线程安全的,那么AtomicInteger需要什么呢

Java Volatile是线程安全的,那么AtomicInteger需要什么呢,java,multithreading,atomic,volatile,Java,Multithreading,Atomic,Volatile,就像AtomicInteger一样,它也是线程安全的,正如理论所说,我已经通过了代码和技术,使它成为线程安全的 在计算机科学中,比较和交换(CAS)是一种用于多线程实现同步的原子指令。 它将内存位置的内容与给定值进行比较,并且仅当它们相同时,才会将该内存位置的内容修改为给定的新值。 这是作为单个原子操作完成的。原子性保证根据最新信息计算新值;如果该值已更新 同时,由另一个线程执行,写入将失败。操作结果必须表明其是否执行了替换;这也可以做到 使用简单的布尔响应(此变量通常称为比较和设置),或通过返

就像AtomicInteger一样,它也是线程安全的,正如理论所说,我已经通过了代码和技术,使它成为线程安全的

在计算机科学中,比较和交换(CAS)是一种用于多线程实现同步的原子指令。 它将内存位置的内容与给定值进行比较,并且仅当它们相同时,才会将该内存位置的内容修改为给定的新值。 这是作为单个原子操作完成的。原子性保证根据最新信息计算新值;如果该值已更新 同时,由另一个线程执行,写入将失败。操作结果必须表明其是否执行了替换;这也可以做到 使用简单的布尔响应(此变量通常称为比较和设置),或通过返回从内存位置读取的值(而不是写入的值)

我看过AtomicInteger类的代码

public final int getAndIncrement() {
    for (;;) {
        int current = get();
        int next = current + 1;
        if (compareAndSet(current, next))
            return current;
    }
}
我有一个问题,如果我把一个变量设为线程安全的,只需声明它为volatile 读取该变量的所有线程都将获得最新值。 有谁能解释一下,当我们使用VOLATILE关键字使变量线程安全时 那么为什么我们使用AtomicInteger类使变量线程安全。volatile关键字比AtomicInteger有什么优势

如果我们声明volatile long和volatile double,它们是线程安全的吗
那么为什么它们不是线程安全的呢。不带volatile的int是线程安全的。请expalin

将volatile int保存为并发读取,但不能像atomicInteger类的AtomicIncrementAndGet方法那样进行读写操作


如果在比较“最后一个良好值”并执行实际写入操作后int发生更改,则比较和交换将无法同步使用VOLATILE。使用VOLATILE不会使变量线程安全,它会告诉编译器变量可能随时更改,而不一定是由提供的代码更改

您错过了AtomicInteger中真正重要的部分:

public final boolean compareAndSet(int expect, int update) {
    return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}
在纯java中,您不能用简单的volatile来模仿这一点。它调用本机代码来执行实际的原子比较和设置(CAS)操作


如果您有一个线程更新一个字段,并且有任意数量的线程读取该字段,那么Volatile就可以了。要从多个线程安全地更新字段,您需要原子或同步。

这是什么语言?这应该是你问题的另一个标签。这不是正确的说法。Volatile确实使变量线程安全,可能是为了像increment这样的原子操作,您只需要付出一些额外的努力,但它是线程安全的。这对于Java是不正确的。这个答案可能在被标记为“Java”之前就已经发布了。@jameslarge volatile保证写操作是原子的,即使是对于大于本机单词大小的实体。(这在JLS中有明确解释:对易失性字段(§8.3.1.4)的写入发生在该字段的每次后续读取之前)