Synchronized variavel

5 respostas
S

olá a todos. estou precisando fazer uma aplicação de teste para a faculdade e o professor comentou que as variaveis deveriam ser sincronizadas. Pelo que estive lendo se eu tiver um método que está sendo chamado dentro de uma thread este método deve ser sincronizado(synchronized) isto confere?. por exemplo:

public class Teste extends Thread {

   private int valor;

   public Teste() {
      ...
   }

   public void run() {

      ....
     setValor(10);

      ...
   }

   public synchronized setValor(int valor){
       this.valor = valor;
   }

}

estaria certo da maneira que o professor está pedindo? ou seja ele esta querendo que a variavel valor seja sincronizada.

se alguem poder me auxiliar. abraço.

5 Respostas

ViniGodoy

Você só consegue sincronizar métodos, nunca variáveis. O que ele quis dizer é que todos os métodos que usam aquela variável devem ser sincronizados. Ela deve ser private e nenhum acesso público direto a ela deve ser permitido.

O máximo que vc pode fazer, se uma variável simplesmente é acessada por primitivas simples (como atribuição e leitura), é declara-la como volatile. Aí sim, vc poderia deixar sem sincronização.

public volatile bool simples;

Mas isso só serve para variáveis onde o acesso é trivial, como variáveis boolean. Para qualquer processamento mais elaborado, use synchronized no lugar de volatile.

S

Entendi em partes :smiley: :smiley: , então quer dizer que da maneira que fiz no método setValor está correto? Ou seja, o método está utilizando a variável private valor e então está utilizando sincronização?

ViniGodoy

Sim, falta apenas fazer um getValor() também sincronizado.

ganondorfan

Vini, qual a real vantagem de se utilizar volatile?

ViniGodoy

É um modo simples de “sincronizar” variáveis triviais. Mas, de maneira geral, você não vai usa-lo.

Criado 27 de setembro de 2010
Ultima resposta 28 de set. de 2010
Respostas 5
Participantes 3