【问题标题】:Functioning of volatile variable vs an instance variablevolatile变量与实例变量的功能
【发布时间】:2014-10-09 13:28:17
【问题描述】:

来自Java并发实践

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

还有

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

我的问题是

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

【问题讨论】:

    标签: java multithreading concurrency volatile


    【解决方案1】:

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

    一个非volatile 变量可以在所有线程中缓存任意多次。

    基本上

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

    • 每次您读取 non-volatile 变量时它都有最近从线程写入它的值并且只有可能具有其他线程写入的值。

    在作为问题最常见原因的特定情况下,很可能一个线程将值写入变量,而第二个线程永远不会看到新值。

    【讨论】:

    • 线程在读取写入缓存时也会缓存实例变量吗?
    • @underdog - 他们可以 - 他们实际上并不需要,而且通常他们不需要,但关键是你不能假设任何一种方式。
    • @OldCurmudgeon 你能解释一下“他们实际上不需要”吗?
    • @Prakash - VM writer 根本不需要进行任何缓存,但如果他们这样做,则不允许缓存 valatile 变量。实际上它们是,但对它们的所有访问都必须先刷新它们的任何缓存。
    • @Prakash 是因为底层硬件架构。当多个处理器访问共享内存系统时,每次访问所花费的时间都比处理器访问其自己的私有缓存时长一个数量级。如果时间允许,或者当程序执行特殊的同步指令时(例如,当访问volatile 字段时),处理器合作以使共享内存与它们的缓存保持最新。程序需要同步缓存的频率越低,它的性能就越好。
    猜你喜欢
    • 2014-09-21
    • 1970-01-01
    • 2013-03-22
    • 2011-02-12
    • 2013-03-24
    • 2014-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多