来自Java Concurrency in Practice
线程共享其拥有进程的内存地址空间 进程中的线程可以访问相同的变量& 从同一堆中分配对象。
另外
将变量声明为volatile意味着线程不应该缓存 这样的变量或换句话说,不应该相信这些变量的价值 变量,除非直接从主存储器读取。
我的问题是
假设有一个非易失性实例变量' a'由线程修改。赢得了' a'的修改价值。在堆上更新。如果它在堆上更新,则读取该实例变量的另一个线程将自动读取更新的值,因为线程共享来自堆的实例变量。那么volatile变量的功能如何不同呢?
答案 0 :(得分:3)
区别在于,volatile
变量强制在读取之前从所有缓存中刷新,所有读取都来自主内存。
非volatile
变量可以根据需要在所有线程中缓存多次。
基本上
每次阅读 volatile
变量时,它都具有任何线程中最近一次写入的值
每次阅读 non-volatile
变量时,它都具有此主题线程中最近一次写入的值并且只有可能具有其他线程已写入的值。
在特定情况下,这是问题的最常见原因,一个线程很可能将值写入变量,而第二个线程永远不会看到新值。