Ale*_*hen 47 concurrency android dalvik java-memory-model
我正在研究涉及大量并发编程的Android项目,我将实现一些自定义的线程间通信(java.util.concurent中的那个不适合我的目的).
并发编程一般不容易,但对Dalvik来说似乎更难.要获得正确的代码,您应该了解一些具体的事情以及Dalvik出现问题的地方.我找不到关于Dalvik VM的详细文档.大多数Android资源(甚至developer.android.com专注于平台API,并没有提供任何关于一些非平凡(或低级)事物的深层信息).
例如,Dalvik VM遵循哪个版本的Java语言规范?根据答案,volatile
变量的处理是不同的,并影响使用volatile
变量的任何并发代码.
已经有一些相关问题:
而fadden的一些答案非常有用,但我仍然希望对所讨论的问题有更详细和完整的理解.
所以在我感兴趣的原始问题之下(如果有必要,我将更新列表,因为之前的问题的答案将到达):
volatile
变量语义的支持有多完整?在Android中的双重检查锁定中,fadden提供以下注释:
对.通过添加"volatile"关键字,这将适用于单处理器(所有Android版本)和SMP(3.0"蜂窝"及更高版本)
这是否意味着拥有双核CPU但只有Android 2.3的三星Galaxy SII可能会错误地执行并发代码?(当然Galaxy只是一个例子,关于任何具有Android 3.0前平台的多核设备的问题)
在Is Dalvik的内存模型中与Java相同吗?该法登提供下列句子的答案:
目前没有发布的Dalvik版本与JSR-133完全正确
这是否意味着任何现有的正确并发Java代码在发布此评论的任何Android版本上可能无法正常工作?
@gnat发表评论:
@Alexey Dalvik不符合任何JLS版本,因为一致性要求通过JCK,这不是Dalvik的选项.这是否意味着您甚至无法应用标准Java编译器,因为它符合标准规范?那有关系吗?如果有,怎么样?
好吧,我的问题有些含糊不清.我实际上的意思是JLS不仅是Java编译器实现的规则,而且是任何JVM实现的隐含指南.实际上,例如,JLS声明某些类型的读写是原子操作.编译器编写器不是很有趣,因为读/写只是转换成单个操作码.但是对于任何应该正确实现这些操作码的JVM实现来说都是必不可少的.现在你应该看看我在说什么.虽然Dalvik接受并执行使用标准Java编译器编译的程序,但没有任何保证它们被正确执行(正如您所期望的那样),因为没有人(Dalvik的开发人员除外)知道程序中使用的所有JLS功能是否都受到支持Dalvik的.
很明显,JCK不是Dalvik的选择,而且确实如此,但程序员确实应该知道在Dalvik上执行代码时他们可能依赖的JLS的哪些功能.但是在文档中没有任何关于此的话.虽然您可能期望像=,+, - ,*等这样的最简单的运算符可以正常工作,因为您可以预期变量语义等非平凡功能(在第2版和第3版JLS中有所不同)?而后者并不是您在JLS中可以找到的最重要的事情,特别是在Java内存模型中.volatile
<从评论复制> Dalvik 不符合任何 JLS 版本,因为一致性需要通过JCK,而这对于 Dalvik 来说不是一个选项。</复制自评论>
程序员确实应该知道在 Dalvik 上执行代码时可能依赖 JLS 的哪些功能
我认为他们了解的唯一方法是研究 Dalvik 测试套件(我打赌有一个,而且我希望它是开源的,不是吗?)。对于您需要的任何功能,1)尝试找到一个如果您的功能实现不正确就会失败的测试,并检查该测试看起来是否足够好。如果没有这样的测试或者它不够好,1a)添加新的或改进现有的测试。然后,2) 查明测试是否已针对您的目标实现成功运行。如果测试尚未运行,则 2a) 自行运行并查看它是否通过或失败。
BTW 上面大致讲了JCK 的工作原理。主要区别在于,人们必须在 Dalvik 上投入自己的时间和精力才能获得从 Sun/Oracle 获得的理所当然的东西。另一个区别似乎是,对于 Dalvik 来说,这没有记录,而Snorcle有关于 iirc 的明确文档
但文档中没有任何关于此的文字。
好吧,如果没有任何文字说明,那么我会说 Dalvik 文档的质量不是最优的。轻声细语
归档时间: |
|
查看次数: |
3799 次 |
最近记录: |