Dalvik 的内存模型和 Java 的一样吗?
Posted
技术标签:
【中文标题】Dalvik 的内存模型和 Java 的一样吗?【英文标题】:Is Dalvik's memory model the same as Java's? 【发布时间】:2011-06-03 01:13:15 【问题描述】:Dalvik的内存模型和Java's一样吗?我特别感兴趣的是引用和非long
/non-double
原始变量的读写是否是原子的,但我也想知道两个平台的内存模型之间是否有任何差异。
【问题讨论】:
【参考方案1】:从 4.0(冰淇淋三明治)开始,Dalvik 的行为应该与 JSR-133(Java 内存模型)相匹配。
从 3.0 (Honeycomb) 开始,大部分部件都已到位,但忽略了一些在实践中难以遇到的小问题(例如最终确定中的一些边缘情况)。
从 2.3 (Gingerbread) 开始,Dalvik 在单处理器上通常是正确的,但缺少在 SMP 硬件上正常运行所需的一些关键功能(例如正确的final
字段处理)。
Gingerbread 之前,根本没有记忆障碍,像volatile long
这样的基本东西被打破了。
【讨论】:
模糊相关:android+SMP Primer at developer.android.com/training/articles/smp.html 上面的 SMP 入门读物对于任何处理线程间共享内存的人来说都是必读的。非常感谢你链接这个! @fadden 使用 volatile 修复进行双重检查锁定怎么样?就像这里描述的en.wikipedia.org/wiki/Double-checked_locking#Usage_in_Java 它可以在Android上运行吗?任何版本?它适用于 ART 吗?【参考方案2】:有a document in the Dalvik source 说:
从以 Java 编程语言编写或以相同方式针对 .class 文件的一段代码的角度来看,Dalvik VM 旨在以完全符合该语言定义的方式运行。也就是说,在 Dalvik 中运行的代码的行为与在任何其他虚拟机中运行的代码相同。
这应该意味着该行为与正确的 Java 中的行为相同。不管是不是真的,我不知道。
【讨论】:
【参考方案3】:规范说对 32 位数字(非双精度、非长数字)的所有操作都是原子的。不能保证对 64 位数字的操作也是原子的。
【讨论】:
这是哪个规范?如果您指的是 Java 规范,我认为问题的重点是询问 Dalvik 是否实现了 Java 语义的那一部分。如果您指的是其他规范,有没有机会提供链接?以上是关于Dalvik 的内存模型和 Java 的一样吗?的主要内容,如果未能解决你的问题,请参考以下文章