首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Dalvik VM和Java内存模型(Android上的并发编程)

Dalvik VM和Java内存模型(Android上的并发编程)
EN

Stack Overflow用户
提问于 2011-08-07 23:18:36
回答 4查看 3.9K关注 0票数 47

我正在从事一个涉及大量并发编程的Android项目,我将实现一些自定义的线程间通信工具(来自java.util.concurent的工具不太适合我的目的)。

通常情况下,并发编程并不容易,但对于Dalvik,它似乎更难。为了获得正确的代码,你应该知道一些具体的事情,以及Dalvik出现问题的地方。我只是找不到关于Dalvik VM的详细文档。大多数Android资源(甚至连developer.android.com都专注于platform API,并没有提供任何关于一些非琐碎(或低级)事情的深入信息)。

例如,Dalvik VM符合哪个版本的Java语言规范?根据答案的不同,对volatile变量的处理也不同,并且会影响任何使用volatile变量的并发代码。

已经有一些相关的问题了:

fadden的一些答案非常有用,但我仍然希望对所讨论的问题有更详细和完整的理解。

因此,下面是我感兴趣的原始问题(如果有必要,我会更新列表,因为之前问题的答案将会到来):

  1. 在哪里可以找到关于Dalvik VM的详细信息,这可能会提供以下问题的答案?
  2. Dalvik VM符合哪个版本的Java语言规范?
  3. 如果(2)的答案是“第三版”,那么Dalvik对此规范中所定义的Java内存模型的支持有多完整?尤其是对volatile变量语义的支持有多完整? the Double checked locking in Android

fadden中的

  1. 提供了以下评论:

是啊。通过添加"volatile“关键字,这将适用于单处理器(所有版本的安卓)和SMP (3.0”蜂巢“及更高版本)

这是不是意味着拥有双核处理器但只有Android2.3的三星Galaxy SII可能会错误地执行并发代码?(当然,Galaxy只是一个例子,问题是关于任何Android 3.0平台之前的多核设备)

the Is Dalvik's memory model the same as Java's?

  1. In Is Dalvik's memory model the same as Java's?fadden提供了以下句子的答案:

对于JSR-133,当前发布的Dalvik版本都不是完全正确的。

这是否意味着任何现有的正确的并发Java代码可能会在本文发表之前发布的任何Android版本上不正确地工作?

Update#1:对@gnat评论的回答(太长了,不能作为评论)

@gnat发表评论:

@Alexey Dalvik不符合任何JLS版本,因为一致性需要通过JCK,而这不是Dalvik的选项。这是否意味着您甚至不能应用标准Java编译器,因为它符合标准规范?这很重要吗?如果是,是如何实现的?

我的问题有点模棱两可。我的实际意思是,JLS不仅是Java编译器实现的规则,而且是任何JVM实现的隐含指南。实际上,例如,JLS声明某些类型的读取和写入是原子操作。对于编译器编写者来说,这并不是很有趣,因为读/写只翻译成单个操作码。但是对于任何应该正确实现这些操作码的JVM实现来说,它都是必不可少的。现在你应该明白我在说什么了。虽然Dalvik接受并执行用标准Java编译器编译的程序,但并不能保证它们被正确执行(正如你所期望的那样),因为没有人(可能除了Dalvik的开发人员)知道程序中使用的所有JLS特性是否都被Dalvik支持。

很明显,JCK不是Dalvik的选项,这是可以的,但程序员真的应该知道,当在Dalvik上执行代码时,他们可能依赖于JLS的哪些特性。但在文档中没有任何关于这一点的文字。虽然你可能期望像=,+,-,*等最简单的操作符是你期望的那样工作,但是像volatile变量的语义这样的重要功能呢(这在JLS第2版和第3版中是不同的)?而后者并不是您在JLS中,特别是在Java内存模型中发现的最重要的东西。

EN

回答 4

Stack Overflow用户

发布于 2012-08-03 11:48:04

我还没有完全读完你的问题,但首先不要使用易失性,即使是opengles的程序员也不会在不同的ui和渲染器线程中使用它。

如果且仅当一个线程写入(比如某个类的静态属性)和其他读取时,才使用易失性,即使那时您也必须进行同步,请阅读以下内容以获得处理计数的一些好方法

How to synchronize a static variable among threads running different instances of a class in java?

  1. 总是使用synchronize
  2. do not jump at large projects for concurrent programming
  3. 在游戏中讨论了可运行、处理程序和交换消息线程(UI线程和渲染器线程)的概念。
票数 2
EN

Stack Overflow用户

发布于 2012-07-29 18:30:30

我认为您回答了自己的问题,尽管您没有详细说明为什么java.util.concurrent包不能满足您的需求,但大多数移动应用程序只是使用异步IO和最少的线程。这些设备不是能够进行真正的分布式处理的超级计算机,所以我很难理解为什么java.util.concurrent不能满足您的需求。

其次,如果你有关于Dalvik实现的问题,以及它是否符合JLS (它不符合),那么似乎可以推断出,对线程机制的唯一可靠支持将是该语言定义的那些机制-- java.util.concurrent、runnable和线程本地存储。

在内置语言支持之外手动滚动任何东西都只会自找麻烦,而且正如您的问题所暗示的那样,在Dalvik上可能不会以一致的方式支持。

像往常一样,当你认为自己可以比那些编写Java的人做得更好的时候,请三思。

票数 1
EN

Stack Overflow用户

发布于 2011-08-16 19:13:48

Dalvik不符合任何JLS版,因为一致性需要通过JCK,而这不是Dalvik的选项。复制

当在Dalvik上执行代码时,

程序员确实应该知道他们可能依赖于JLS的哪些特性

我认为让他们知道的唯一方法是研究Dalvik测试套件(我打赌有一个,我希望它是开源的,不是吗?)。对于你需要的任何功能,1)尝试找到一个如果你的功能没有正确实现就会失败的测试,并检查测试看起来是否足够好。如果没有这样的测试,或者它不够好,1a)添加新的或改进现有的测试。然后,2)找出测试是否已经针对您的目标实现成功运行。如果测试还没有运行,那么2a)自己运行它,看看它是通过了还是失败了。

顺便说一句,上面大致介绍了JCK的工作原理。主要的不同之处在于,为了从Sun/Oracle获得理所当然的东西,人们必须在Dalvik身上投入自己的时间和精力。另一个不同之处似乎是,对于Dalvik来说,这是没有文档记录的,而Snorcle有关于该iirc的明确文档。

,但在文档中没有任何关于这一点的文字。

好吧,如果这上面没有文字,那么我会说Dalvik文档的质量是次优的。柔和地说

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6973667

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档