Re:Duvida com variavel Volatile [Resolvido]

1 resposta
A

Pessoal estudando sobre threads / volatile, entre outros detalhes, tentei implementar algo com volatile.

Pelo que entendi, quando você não precisa ter controle na gravação de uma variavel, ou seja, não precisa sincronizar a escrita e quer que os dados reflita em outra thread, então é utilizado volatile.

Conditions for correct use of volatile

You can use volatile variables instead of locks only under a restricted set of circumstances. Both of the following criteria must be met for volatile variables to provide the desired thread-safety:

* Writes to the variable do not depend on its current value.
* The variable does not participate in invariants with other variables.
Fonte: http://www.ibm.com/developerworks/java/library/j-jtp06197.html

Porem quando fiz este teste, o valor que é alterado na thread de escrita, não é mostrado na thread de leitura, o que fiz de errado? Segue abaixo as classes.
import java.util.Random;

public class Principal {
	
	public volatile Integer count = 0;
	public static void main(String[] args) {
		
		Principal p = new Principal();
		new Thread(new Escrita(p.count)).start();
		new Thread(new Leitura(p.count)).start();
	}
}
class Leitura implements Runnable {

	private Integer count;
	public Leitura(Integer count) {
		this.count = count;
	}
	
	private void execute() throws InterruptedException {
		while (true) {
			System.out.println("Valor de count: " + count);
			Thread.sleep(2000);
		}
	}
	
	@Override
	public void run() {
		try {
			execute();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}
class Escrita implements Runnable {

	private Integer count;
	public Escrita(Integer count) {
		this.count = count;
	}
	
	private void execute() throws InterruptedException {
		Random r = new Random();
		while (true) {
			count = r.nextInt(1000);
			System.out.println("Gravado: " + count);
			Thread.sleep(3000);
		}
	}
	
	@Override
	public void run() {
		try {
			execute();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}
Resultado: Valor de count: 0 Gravado: 255 Valor de count: 0 Gravado: 626 Valor de count: 0 Valor de count: 0 Gravado: 905 Valor de count: 0

Att

1 Resposta

A

Pessoal, pesquisando aqui sobre Volatile, vi que o problema no meu caso é a classe Wrapper Integer ser Imutável, logo estou sempre criando um novo objeto.

Agradeço a todos, mas acredito que a duvida ja foi resolvida, só preciso ler mais sobre variavel volatile.

Att

Criado 16 de fevereiro de 2011
Ultima resposta 17 de fev. de 2011
Respostas 1
Participantes 1