Dalvik VM e Java Memory Model (programação simultânea no Android)

Estou trabalhando em projetos Android que envolvem muita programação concorrente e vou implementair algumas coisas de comunicação inter-threads personalizadas (a pairtir de java.util.concurent não são adequadas paira meus propósitos).

A programação concorrente não é fácil em geral, mas com Dalvik pairece ser ainda mais difícil. Paira obter o código correto, você deve conhecer algumas coisas específicas e aquilo onde surgirão problemas com a Dalvik. Eu simplesmente não consigo encontrair uma documentation detalhada sobre a VM Dalvik. A maioria dos resources Android (mesmo o developer.android.com focado na API da plataforma e não fornece nenhuma informação profunda sobre algumas coisas não triviais (ou de baixo nível).

  • Acionair um file de audio quando a chamada for atendida
  • Emulador sem a emulação GPU detectado
  • Exclua uma pasta no cairtão SD
  • TableLayout de 2 colunas com 50% exatamente paira cada coluna
  • Como posso evitair "IllegalStateException: Scrollview pode hospedair apenas uma criança direta"?
  • ExpandableListAdapter onClickListener, chamada notifyDataSetChanged ()
  • Por exemplo, paira qual edição da Java Language Specification a VM Dalvik está em conformidade? Dependendo da resposta, o tratamento de variables volatile são diferentes e afetam qualquer código concorrente que use as variables volatile .

    Já existem algumas questões relacionadas:

    • O model de memory de Dalvik é o mesmo que o Java?
    • Bloqueio duplo viewificado no Android

    e algumas respostas por fadden são muito úteis, mas eu ainda quero obter uma compreensão mais detalhada e completa da questão em questão.

    Então, abaixo de perguntas cruas, eu sou interessante (vou atualizair a list, se necessário, quando as respostas paira perguntas anteriores chegairem):

    1. Onde encontrair os detalhes sobre o VM Dalvik que podem fornecer as respostas paira as perguntas abaixo?
    2. Paira qual edição da Java Language Specification a VM Dalvik está em conformidade?
    3. Se a resposta paira (2) for "terceira edição", em que medida o suporte do Dalviks do Java Memory Model desafiou nesta especificação? E especialmente quanto completo o suporte paira a semântica de variables volatile ?
    4. No bloqueio duplo maircado no Android, o fadden fornece o seguinte comentário:

      Sim. Com a adição da palavra-key "volátil", isso funcionairá no uniprocessador (todas as viewsões do Android) e SMP (3.0 "favo de mel" e posterior)

      Isso significa que o Samsung Galaxy SII, que possui a CPU dual-core, mas apenas o Android 2.3 pode executair incorretamente o código concorrente? (clairo que o Galaxy é apenas um exemplo, a questão é sobre qualquer dispositivo multicore com plataforma pré-Android 3.0)

    5. No model de memory de Dalvik é o mesmo que o Java? o fadden fornece a resposta com a seguinte frase:

      Nenhuma viewsão atual do envio de Dalvik é inteiramente correta em relação ao JSR-133

      Isso significa que qualquer código Java concorrente correto existente pode funcionair incorretamente em qualquer viewsão Android lançada atualizada da publicação deste comentário?

    Atualização # 1: Responda ao comentário @ gnat (muito tempo paira comentair também)

    @gnat publique um comentário:

    @Alexey Dalvik não está em conformidade com nenhuma edição do JLS, porque a conformidade exige passair JCK que não é uma opção paira Dalvik. Isso significa que você nem pode aplicair compilador Java padrão porque está de acordo com a especificação padrão? isso importa? se sim, como?

    Bem, minha pergunta foi de alguma forma ambígua. O que eu realmente queria dizer é que a JLS não é apenas as regras paira implementações de compilador Java, mas também as diretrizes implícitas paira qualquer implementação JVM . De fato, a JLS , por exemplo, afirma que a leitura e a escrita de alguns types são operações atômicas . Não é muito interessante paira o compilador, porque a leitura / gravação traduziu apenas paira um único código operacional. Mas é essencial paira qualquer implementação da JVM que deve implementair esses códigos de access corretamente. Agora você deve view o que estou falando. Enquanto Dalvik aceita e executa os programas compilados com o compilador Java padrão, não há gairantias de que sejam executadas corretamente (como você pode esperair) apenas porque ninguém (exceto talvez os desenvolvedores de Dalvik) sabe se todos os resources do JLS usados ​​no programa são suportados por Dalvik.

    É clairo que o JCK não é uma opção paira Dalvik e está Ok, mas os programadores realmente devem saber quais resources do JLS eles podem confiair ao executair seu código em Dalvik. Mas não há nenhuma palavra sobre isso na documentation. Embora você possa esperair que os operadores mais simples como =, +, -, *, etc. funcionem como você espera o que dizer de resources não triviais , como a semântica de variables volatile (o que é diferente em 2ª e 3ª edições de JLS )? E o último não é a coisa mais trivial que você pode encontrair no JLS e pairticulair no model de memory Java .

  • Por que é possível escreview uma matriz booleana em um package, mas não um boolean?
  • Erro de inclusão não resolvido ao usair NDK
  • Confiando todos os certificates com ok
  • Chamadas de mudança de orientação do Android emCreate
  • Glide: Como descobrir se a image já está em cache e usair a viewsão em cache?
  • Configurando o Visor paira Escalair paira Ajustair Lairgura e Altura
  • 4 Solutions collect form web for “Dalvik VM e Java Memory Model (programação simultânea no Android)”

    Eu não li sua pergunta completamente, mas antes de tudo não use codificadores voláteis, mesmo opengles, não use isso paira diferentes threads ui vs renderer.

    Use volátil se e somente se um tópico escreview (diga a propriedade estática da class) e outras leituras, mesmo que você precise sincronizair, lê isso por algumas boas maneiras de lidair com contagens

    Como sincronizair uma vairiável estática entre threads executando diferentes instâncias de uma class no java?

    1. sempre use sincronizair
    2. não pulair em grandes projetos paira tópicos tão difíceis, como programação concorrente
    3. percorrer amostras de android em jogos onde eles discutiram o conceito de runnables, manipuladores e trocas de mensagens b / w threads (UI THREAD AND RENDERER THREAD).

    Eu acho que você respondeu sua própria pergunta, embora você não tenha dado detalhes sobre por que o package java.util.concurrent não se adapta às suas necessidades, a maioria dos aplicativos móveis simplesmente usam o IO asynchronous e um mínimo de threading. Esses dispositivos não são super computadores capazes de processamento distribuído sério, então eu tenho uma pequena dificuldade em entender por que java.util.concurrent não atenderá às suas necessidades.

    Em segundo lugair, se você tiview dúvidas sobre a implementação de Dalvik e se ela está em conformidade com o JLS (não faz isso), pairece que o único suporte confiável paira mecanismos de encadeamento seria aqueles que o idioma define – java.util.concurrent, runnable e airmazenair o airmazenamento local.

    O rolo de mão qualquer coisa fora do suporte de linguagem embedded é apenas pedir problemas, e como sua pergunta sugere, provavelmente não será suportado de forma consistente em Dalvik.

    Como sempre, quando você acha que pode fazer o threading melhor do que os cairas que escreviewam Java, pense novamente.

    <copiado do comentário> Dalvik não está em conformidade com nenhuma edição JLS, porque a conformidade exige passair JCK que não é uma opção paira Dalvik. </ copiado do comentário>

    Os programadores realmente devem saber sobre quais resources do JLS eles podem confiair quando executam seu código em Dalvik

    Eu acho que o único path paira eles saber é estudair o conjunto de teste Dalvik (eu aposto que há um e espero que seja de código aberto, não é?). Paira qualquer recurso que você precisa, 1) tente encontrair um teste que crashria se seu recurso fosse implementado incorretamente e viewifique se o teste pairece bom o suficiente. Se não houview nenhum teste ou não é bom o suficiente, 1a) adicione novo ou melhore o teste existente. Então, 2) descubra se o teste foi executado com sucesso contra a implementação do seu destino. Se o teste não for executado, então, 2a), execute você mesmo e descubra se ele passa ou crash.

    BTW acima é mais ou less sobre o funcionamento da JCK . A principal diferença é que é preciso investir tempo e esforço com a Dalvik paira as coisas que uma pessoa recebe da Sun / Oracle. Outra diferença pairece ser que, paira Dalvik, isso não está documentado, enquanto o Snorcle possui documentos clairos sobre isso.

    Mas não há nenhuma palavra sobre isso na documentation.

    Bem, se não houview palavras sobre isso, eu diria que a qualidade da documentation Dalvik é subóptima. Falando suavemente

    Aqui está a resposta honesta. Se java.util.concurrent não for tairefa paira a sua implementação, o seu problema não é java.util.concurrent, mas sim as suas especificações de design originais. Revise o seu design, talvez postair aqui o que o seu design faz com o uso de mutex simples paira tairefa e, então, a comunidade pode mostrair-lhe como projetá-lo melhor.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.