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

通常,并发编程并不容易,但是使用Dalvik似乎更难。为了获得正确的代码,您应该了解一些特定的知识,以及Dalvik出现问题的地方。我只是找不到有关Dalvik VM的详细文档。大多数Android资源(甚至 developer.android.com 都集中在平台API上,并且不提供有关某些非琐碎(或低级)内容的任何深层信息)。

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

已经有一些相关的问题:

  • Is Dalvik's memory model the same as Java's?
  • Double checked locking in Android

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

    因此,在一个原始问题下面,我很感兴趣(如有必要,我将更新列表,因为先前的问题将得到答案):
  • 在哪里可以找到有关Dalvik VM的详细信息,它可以为以下问题提供答案?
  • Dalvik VM符合哪个Java语言规范版本?
  • 如果对(2)的回答是“第三版”,那么Dalviks对本规范中定义的Java内存模型的支持有多完整?尤其是如何完成对volatile变量语义的支持?
  • Double checked locking in Android中,淡淡的中提供以下注释:



    这是否意味着具有双核CPU但只有Android 2.3的三星Galaxy SII 可能会错误地执行并发代码? (当然,Galaxy仅是示例,问题是有关具有Android 3.0之前的平台的任何多核设备的)
  • Is Dalvik's memory model the same as Java's?中,淡淡的提供以下句子:



    这是否意味着在发布此评论之前,任何现有的正确并发Java代码可能在任何Android版本上均无法正常工作?

  • 更新#1:回答@gnat的评论(太久也无法发表评论)

    @gnat发表评论:



    好吧,我的问题有点模棱两可。我真正的意思是,JLS不仅是Java编译器实现的规则,而且还是任何JVM实现的隐含准则。的确,例如,JLS声明某些类型的读取和写入是原子操作。对于编译器编写者来说不是很有趣,因为读/写仅转换为单个操作码。但是,对于任何应该正确实现这些操作码的JVM实现而言,这都是至关重要的。现在您应该明白我在说什么。尽管Dalvik接受并执行使用标准Java编译器编译的程序,但没有任何保证,它们可以正确执行 (如您所料),只是因为没有人(也许Dalvik的开发人员除外)才知道是否所有JLS的功能都用于该程序由Dalvik支持。

    显然,JCK不是Dalvik的选择,这是可以的,但是程序员确实应该知道在Dalvik上执行代码时,他们可能依赖于JLS的哪些功能。但是,文档中对此一无所知。尽管您可能希望最简单的运算符(例如=,+,-,*等)可以正常工作,但是您会想到诸如volatile变量的语义之类的非平凡功能(在JLS的第二版和第三版中有所不同)吗?后者并不是您可以在JLS中发现的最平凡的东西,尤其是在Java内存模型中。

    最佳答案

    我还没有完全读完你的问题,
    但首先不要使用volatile,即使opengles编码人员也不要将其用于不同的ui与渲染器线程。

    当且仅当一个线程写入(使用某个类的静态属性)时,才使用volatile
    和其他读物,即使您必须进行同步,也请阅读此书以获取一些处理计数的好方法

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

  • 始终使用同步
  • 不会在大型项目中遇到诸如并发编程
  • 之类的难题
  • 浏览了游戏中的android示例,他们讨论了runnable的概念,
    处理程序,并交换消息黑白线程(UI线程和RENDERER线程)。
  • 关于android - Dalvik VM和Java内存模型(Android上的并行编程),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6973667/

    10-11 07:19