Dalvik的内存模型和Java的一样吗?

30

Dalvik的内存模型与Java相同吗? 我特别想知道对引用和非long/非double原始变量的读写是否是原子操作,但我也想知道这两个平台的内存模型是否有任何差异。

3个回答

63

从4.0版本(冰激凌三明治)开始,Dalvik的行为应该与JSR-133(Java内存模型)相匹配。

从3.0版本(蜂巢)开始,大部分功能已经到位,但一些小问题被忽视了,在实践中很难遇到(例如,某些终止边缘情况)。

在2.3版本(姜饼)中,单处理器上的Dalvik基本上是正确的,但一些关键特性需要适当的SMP硬件支持(例如,适当的final字段处理)。

Gingerbread之前,根本没有内存屏障,基本的东西像volatile long都是有问题的。


9
相关程度不太清楚:Android+SMP入门指南位于http://developer.android.com/training/articles/smp.html。 - fadden
1
以上的SMP入门指南对于任何处理线程之间共享内存的人来说都是必读的。非常感谢您提供链接! - asm
3
@fadden,使用 volatile 修复的双重检查锁定如此描述:http://en.wikipedia.org/wiki/Double-checked_locking#Usage_in_Java。这在 Android 上可行吗?任何版本?在 ART 上可行吗? - Daniele Segato

13

在Dalvik源代码中有一个文档,链接在此,其中写道:

从用Java编写的代码或针对.class文件的代码的角度来看,Dalvik虚拟机旨在以完全符合语言定义的方式运行。也就是说,在Dalvik中运行的代码与在任何其他虚拟机中运行的代码的行为是相同的。

这意味着它应该与正确的Java表现相同。它实际上是否如此,我不知道。


0
规格说明中指出,所有32位数字(非双精度、非长整型数字)的操作都是原子操作。无法保证64位数字的操作也是原子操作。

4
这是哪个规格?如果您指的是Java规格,我想问题的重点是询问Dalvik是否实现了Java语义的那部分。如果您指的是其他规格,请问有链接吗? - Tom Anderson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接