Java volatile变量与实例变量的功能

Java volatile变量与实例变量的功能,java,multithreading,concurrency,volatile,Java,Multithreading,Concurrency,Volatile,从Java并发的实践看 线程共享其所属进程的内存地址空间,所有 进程中的线程可以访问相同的变量& 从同一堆中分配对象 也 将变量声明为volatile意味着线程不应该缓存 这样的变量或换句话说,不应信任这些变量的值 变量,除非它们直接从主存中读取 我的问题是 假设有一个由线程修改的非易失性实例变量“a”。“a”的修改值不会在堆上更新。如果它在堆上更新,另一个读取该实例变量的线程将自动读取更新后的值,因为线程共享堆中的实例变量。那么,挥发性变量的功能有什么不同呢 不同之处在于volatile变量在

从Java并发的实践看

线程共享其所属进程的内存地址空间,所有 进程中的线程可以访问相同的变量& 从同一堆中分配对象

将变量声明为volatile意味着线程不应该缓存 这样的变量或换句话说,不应信任这些变量的值 变量,除非它们直接从主存中读取

我的问题是


假设有一个由线程修改的非易失性实例变量“a”。“a”的修改值不会在堆上更新。如果它在堆上更新,另一个读取该实例变量的线程将自动读取更新后的值,因为线程共享堆中的实例变量。那么,挥发性变量的功能有什么不同呢

不同之处在于
volatile
变量在读取之前被强制从所有缓存中刷新,并且所有读取都来自主内存

非volatile变量可以在所有线程中缓存任意次数

本质上

  • 每次读取
    volatile
    变量时,它都有任何线程最近写入的值

  • 每次读取
    非易失性
    变量时,它都有线程最近写入的值,并且只有可能有其他线程写入的值


在最常见的问题原因的特定情况下,一个线程很有可能将值写入变量,而第二个线程却从未看到新值。

不同之处在于,在读取之前,一个
volatile
变量被强制从所有缓存中刷新,并且所有读取都会发生从主存储器

volatile
变量可以在所有线程中缓存任意次数

本质上

  • 每次读取
    volatile
    变量时,它都有任何线程最近写入的值

  • 每次读取
    非易失性
    变量时,它都有线程最近写入的值,并且只有可能有其他线程写入的值


在最常见的问题原因的特定情况下,一个线程很有可能将值写入变量,而第二个线程却从未看到新值。

不同之处在于,在读取之前,一个
volatile
变量被强制从所有缓存中刷新,并且所有读取都会发生从主存储器

volatile
变量可以在所有线程中缓存任意次数

本质上

  • 每次读取
    volatile
    变量时,它都有任何线程最近写入的值

  • 每次读取
    非易失性
    变量时,它都有线程最近写入的值,并且只有可能有其他线程写入的值


在最常见的问题原因的特定情况下,一个线程很有可能将值写入变量,而第二个线程却从未看到新值。

不同之处在于,在读取之前,一个
volatile
变量被强制从所有缓存中刷新,并且所有读取都会发生从主存储器

volatile
变量可以在所有线程中缓存任意次数

本质上

  • 每次读取
    volatile
    变量时,它都有任何线程最近写入的值

  • 每次读取
    非易失性
    变量时,它都有线程最近写入的值,并且只有可能有其他线程写入的值


在最常见的问题原因的特定情况下,一个线程很可能向变量写入值,而第二个线程从未看到新值。

线程在读写缓存时也会看到新值,即使是实例变量?@underdog-它们可以-它们实际上不必这样做,而且通常不必这样做,但是关键的一点是你不能假设任何一种方式。@OldCurmudgeon你能解释一下“他们实际上不需要”@Prakash-虚拟机编写器根本不需要做任何缓存,但如果他们做了,他们就不允许缓存
valatile
变量。实际上它们是,但所有对它们的访问必须首先刷新它们的任何缓存。@Prakash这是因为底层的硬件架构。当多个处理器访问共享内存系统时,每次访问的时间都比处理器访问自己的私有缓存时长一个数量级。在时间允许的情况下,或当程序执行特殊同步指令时(例如,访问
volatile
字段时),处理器协同工作,使共享内存及其缓存保持最新。一个程序需要同步缓存的频率越低,它的性能就越好。线程在读写缓存时也是如此,即使是实例变量也是如此?@underdog-它们可以-它们实际上不需要,而且通常不需要,但关键点是你不能假设任何一种方式。@OldCurmudgeon你能解释一下“它们实际上不需要”?@Prakash-虚拟机编写器根本不需要进行任何缓存,但如果进行了缓存,则不允许缓存
valatile
变量。实际上