volatile如何实际起作用?


问题内容

将变量标记为volatileJava中的变量可确保每个线程都能看到最后写入该变量的值,而不是一些过时的值。我想知道这是如何实现的。JVM是否发出冲洗CPU现金或其他东西的特殊指令?


问题答案:

据我了解,它总是看起来好像写后缓存已被刷新,并且总是看起来好像是在读取时直接从内存中进行读取。这样做的结果是,一个线程将始终看到另一个线程的写入结果,并且(根据Java内存模型)永远不会看到缓存的值。但是,实际实现和CPU指令会因一种体系结构而异。

如果您在一个以上的线程中递增变量,或检查其值并采取某些措施,则不能保证正确性,因为显然没有实际的同步。通常,只有仅线程正在写入变量,而其他线程都正在读取时,才可以保证正确执行。

另请注意,可以将64位NON-
volatile变量作为两个32位变量进行读取/写入,因此32位变量在写入时是原子的,而64位变量则不是。可以先写入一半,然后读取的值可以是旧值或新值。

这是我书签中非常有用的页面:

http://www.cs.umd.edu/~pugh/java/memoryModel/