2014-10-09 102 views
0

从Java并发的运作volatile变量VS实例变量

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

另外

声明变量为线程不应该缓存 这种可变或者换句话说不应该相信这些 变量的值,除非它们被直接从主存储器读出的挥发性装置。

我的问题是

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

回答

3

区别在于volatile变量是强制在读取之前从所有缓存刷新并且所有读取来自主存储器。

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

本质

  • 每次阅读它拥有最新的写入它从任何线程值一volatile变量

  • 每次阅读一个non-volatile变量它拥有最新的写入它从这个线程值只有可能有其他线程写的值。

在这是问题的最常见的原因很可能对一个线程写入值的变量和第二线程从未特定情况下看到了新的价值。

+0

那么,在读写缓存甚至是实例变量的时候线程呢? – underdog 2014-10-09 13:37:13

+1

@underdog - 他们**可以** - 他们实际上并不需要,而且他们通常不会,但临界点是您不能采取任何方式。 – OldCurmudgeon 2014-10-09 13:38:29

+0

@OldCurmudgeon你能解释一下“他们实际上不需要”吗? – Prakash 2014-10-09 13:48:13