gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-28 23:47:36 26 4
gpt4 key购买 nike

我正在从事涉及大量并发编程的 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

  • 和一些答案 法登非常有用,但我仍然想更详细和完整地了解相关问题。

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

    Yup. With the addition of the "volatile" keyword, this will work on uniprocessor (all versions of Android) and SMP (3.0 "honeycomb" and later)



    是否意味着三星 Galaxy SII 哪个有双核CPU但只有Android 2.3可能会错误地执行并发代码? (当然 Galaxy 只是一个例子,问题是关于任何具有 pre-Android 3.0 平台的多核设备)
  • Is Dalvik's memory model the same as Java's? 法登用以下句子提供答案:

    No currently-shipping version of Dalvik is entirely correct with respect to JSR-133



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

  • 更新#1:回答@gnat 的评论(评论太长了)

    @gnat 发表评论:

    @Alexey Dalvik does not conform to any JLS edition, because conformance requires passing JCK which is not an option for Dalvik. Does it mean that you even can't apply standard Java compiler because it conform to standard specification ? does that matter? if yes, how?



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

    很明显,JCK 不是 Dalvik 的选项,它是好的,但程序员真的应该知道在 Dalvik 上执行他们的代码时他们可能依赖 JLS 的哪些特性。但是文档中没有任何关于此的字样。虽然你可能期望像 =、+、-、* 等最简单的操作符可以像你期望的那样工作,比如 volatile 的语义这样的非平凡特征会怎样。变量(在 JLS 的第 2 版和第 3 版中有所不同)?后者并不是您在 JLS 中可能会发现的最重要的事情,尤其是在 Java 内存模型中。

    最佳答案

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

    当且仅当一个线程写入时才使用 volatile(比如某个类的静态属性)
    和其他读取,即使这样你也必须同步,阅读这个以获取一些处理计数的好方法

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

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

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com