Threads não sincronizadas

Estou com um código de threads para gerar três produtos e calcular o índice em cima do preço original. A minha pergunta é: por que a segunda thread pega o valor definido pela primeira, se ao instanciar um novo objeto ele cria com o valor original?

OBJETO

package javaAvancado;

public class Cap4Ex5Produtos {

	private double preco;

	public synchronized double verificarPreco() {
		return this.preco;
	}

	public synchronized void reajustarPreco(double taxa) {
		this.preco = this.preco * taxa;
	}

	public double efetuarCompra() {
		return this.preco;
	}

	/**
	 * @param preco
	 */
	public Cap4Ex5Produtos(double preco) {
		super();
		this.preco = preco;
	}
}

THREAD

package javaAvancado;

public class Cap4Ex5ProcessaProdutos implements Runnable {

	double preco = 2.0;
	
	Cap4Ex5Produtos produto = new Cap4Ex5Produtos(preco); 
	
	double indice = 3.0;
	
	@Override
	public synchronized void run() {
		System.out.println(Thread.currentThread().getName() +  " / Preço: " + produto.verificarPreco());
		produto.reajustarPreco(indice);
		System.out.println(Thread.currentThread().getName() + " / Novo preço: " + produto.verificarPreco());
		produto.efetuarCompra();
	}
}

PRINCIPAL

package javaAvancado;

public class Cap4Ex5Principal {
	
	public static void main(String[] args) {
		
		Cap4Ex5ProcessaProdutos processos = new Cap4Ex5ProcessaProdutos();
		
		Thread processoUm = new Thread(processos);
		Thread processoDois = new Thread(processos);
		Thread processoTres = new Thread(processos);
		
		processoUm.setName("P1");
		processoDois.setName("P2");
		processoTres.setName("P3");
		
		processoUm.start();
		processoDois.start();
		processoTres.start();
	}
}

RESULTADO

P1 / Preço: 2.0
P1 / Novo preço: 6.0
P3 / Preço: 6.0
P3 / Novo preço: 18.0
P2 / Preço: 18.0
P2 / Novo preço: 54.0

Agradeço desde já pela ajuda!

Obrigado a todos(as)!

Você está usando uma única instância de Cap4Ex5ProcessaProdutos e o método run está synchronized. Isso irá fazer com que as threads executem em fila e não paralelamente, e como a instância de produto é a mesma para as 3 threads, o valor gerado pela primeira thread, será usado na proxima e assim por diante.

1 curtida