在javaeye有位朋友问了我一个非常好的问题。
一个线程向volatile的数组中设置值,而另一个线程向volatile的数组中读取。 比如seg.setValue(2),随后另一个线程调用seg.getValue(2),前一个线程设置的值对读取的线程是可见的吗?
我看书上说volatile的数组只针对数组的引用具有volatile的语义,而不是它的元素。
ConcurrentHashMap中也有这样的代码,我很疑惑,希望得到你的解答,谢谢。
public class Seg { private volatile Object[] tabs = new Object[10]; public void setValue(int index) { tabs[index] = new Object(); } public Object getValue(int index) { return tabs[index]; } }我做了实验证实这句话是正确的,“volatile的数组只针对数组的引用具有volatile的语义
private static volatile Object[] tabs = new Object[10]; public static void main(String[] args) { tabs[0]=1; tabs=new Object[10]; } ,而不是它的元素”。测试代码如下:
private static volatile Object[] tabs = new Object[10]; public static void main(String[] args) { tabs[0]=1; tabs=new Object[10]; }编译成汇编语句如下
Java HotSpot(TM) Client VM warning: PrintAssembly is enabled; turning on DebugNonSafepoints to gain additional output CompilerOracle: compileonly *ArrayTest.main Loaded disassembler from D:\java\jdk1.6.0_33\jre\bin\client\hsdis-i386.dll Decoding compiled method 0x009ec7c8: Code: [Disassembling for mach='i386'] [Entry Point] [Verified Entry Point] [Constants] # {method} 'main' '([Ljava/lang/String;)V' in 'volatileTest/ArrayTest' # parm0: ecx = '[Ljava/lang/String;' # [sp+0x30] (sp of caller) 0x009ec8e0: mov