Pergunta

Lendo alguns fios ( problemas de concorrência comuns , palavra-chave , memória modelo ) estou confuso sobre problemas de concorrência em de java.

Eu tenho um monte de campos que são acessados ??por mais de um segmento. Devo passar por eles e marcá-los todos tão volátil?

Ao construir uma classe que eu não estou ciente de se vários segmentos irá acessá-lo, então certamente não é seguro para deixar qualquer campo não ser volátil, por isso, o meu entendimento há muito poucos casos, você não iria 't usá-lo. É este correto?

Para mim, este é específico para a versão 1.5 JVMs e mais tarde, mas não se sentem limitados a responder sobre a minha configuração específica.

Foi útil?

Solução

Se um campo é acessado por vários segmentos, deve ser volatile ou final, ou acessado apenas com blocos sincronizados. Caso contrário, os valores atribuídos não podem ser visíveis para outros tópicos.

A classe tem que ser projetado especificamente para acesso simultâneo por vários threads. Simplesmente marcação campos volátil ou final não é suficiente para thread-segurança. Há problemas de consistência (atomicidade de alterações em vários campos), as preocupações sobre a sinalização inter-thread (por exemplo, usando wait e notify), etc.

Assim, é mais seguro assumir que um objecto deve ser visível apenas para um único segmento a menos que seja documentado de outra forma. Fazendo todos os seus objetos thread-safe não é necessário, e é caro, em termos de velocidade software, mas mais importante, em termos de despesas de desenvolvimento.

Em vez disso, o software deve ser projetado de modo que threads simultâneos interagem uns com os outros tão pouco quanto possível, de preferência não em todos. Os pontos onde eles precisam interagem para ser claramente identificados para que os controles de simultaneidade adequados podem ser projetados.

Outras dicas

Bem, você leu aquelas outras perguntas e eu presumo que você já leu as respostas já, então eu vou apenas destacar alguns pontos-chave:

  1. é que eles vão mudar? se não, você não precisa volátil
  2. Se sim, então é o valor de um campo relacionado a outro? se sim, ir para o ponto 4
  3. quantos threads vai mudar isso? se apenas 1, então volátil é tudo que você precisa
  4. Se a resposta a número 2 é "não" ou mais de tópicos vai escrever a ele, então voláteis sozinho é não é suficiente , você provavelmente vai precisar para sincronizar o acesso

Adicionado:
Se a referência de campo de um objeto, então ele vai ter campos próprios e todos aqueles consideração também se aplica a esses campos.

Se você tem que perguntar, utilizar bloqueios. volatile pode ser útil em alguns casos, mas é muito, muito difícil de acertar. Por exemplo:

class Foo {
  private volatile int counter = 0;
  int Increment() {
    counter++;
    return counter;
  }
}

Se dois threads executar Increment(), ao mesmo tempo, é possível que o resultado seja counter = 1. Isso ocorre porque o computador irá primeiro recuperar counter, adicione um, em seguida, salvá-lo de volta. Voláteis forças apenas a salvar e carregar a ocorrer em uma ordem específica em relação a outras declarações.

Note que synchronized geralmente elimina a necessidade de volatile -. Se todos os acessos a um determinado campo são protegidos pelo mesmo monitor, nunca será necessário volatile

Usando volatile fazer algoritmos Lockless é muito, muito difícil; vara para synchronized menos que você tenha provas concretas de que ele é muito lento já, e ter feito uma análise detalhada sobre o algoritmo que pretende implementar.

A resposta curta não é. threading problemas exigem mais pensamento e planejamento do que isso. Consulte este para algumas limitações quando volátil ajuda para rosqueamento e quando o faz não. A alteração dos valores tem de ser devidamente sincronizado, mas muito tipicamente requer modificação do estado de mais do que uma variável de cada vez. Digamos, por exemplo, você tem variável e você quer mudá-lo se ele atende um critério. A leitura da matriz e da escrita para a matriz são diferentes instruções, e precisam ser sincronizados juntos. Volátil não é suficiente.

Considere também o caso em que as referências de variáveis ??um objeto mutável (digamos uma matriz ou uma Collection), em seguida, interagir com esse objeto não será segmento seguro apenas porque a referência é volátil.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top