Thread

[code]public class Threads1 {
int x = 0;

public class Runner implements Runnable {
	public void run() {
		int current = 0;
		for (int i = 0; i < 4; i++) {
			current = x;
			System.out.print(current + ", ");
			x = current + 2;
		}
	}
}

public static void main(String[] args) {
	new Threads1().go();
}

public void go() {
	Runnable r1 = new Runner();
	new Thread(r1).start();
	new Thread(r1).start();
}

}
/*
Which two are possible results? (Choose two.)
A. 0, 2, 4, 4, 6, 8, 10, 6,
B. 0, 2, 4, 6, 8, 10, 2, 4,
C. 0, 2, 4, 6, 8, 10, 12, 14,
D. 0, 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14,
E. 0, 2, 4, 6, 8, 10, 12, 14, 0, 2, 4, 6, 8, 10, 12, 14,
Answer: AC
*/
[/code]

Por que B não é possível???

D e E lógicamente não são mesmo pois geram uma saída maior do que o possível… mas e a B??

Essa questão estava na minha prova de certificação…

Palpite:

x não é um variável local, logo seu valor é corrente em ambas threads;

current sempre vale x, então, após a primeira execução seu valor será no mínimo 2;

Me perdi na explicação porque a carona está buzinando na porta de casa, mas me parece que o valor 2 na 11º posição quebra a sequência lógica da execução…

Mero palpite, fuis :stuck_out_tongue:

poe para compilar e ver como cada linha opera :). Estava na minha tb, e acredito que acertei… mais tive que ir para o papel e matar ela.

Eu não tenho tanta certeza quee acertei…hehehe

Estava na minha também ( questão 1).

Não tem como ser a “B”, pois após o …,10… aparece um 2, 4.

Como x esta sempre sendo incrementado (dentro do run), e somente é iniciado uma vez em:

desta maneira sempre que uma thread entrar no estado executando, deverá pegar no minímo
um valor igual a x, nunca menor.

Uma pergunta: de onde você tirou esta questão ? :shock:

pois é, mais esta escrito que as corretas são A e C… por que a A???

editando…senão me engano essa questão tb ta no testkiller…

Realmente não vejo como a opção A pode estar correta! Alguém sabe?

Será que o meu raciocínio está errado? :?

Assim:

vou chamar as threads de t1 e t2.
vou explicar pq a A está certa e vc entenderá pq a B esta errada:

suponha que a t1 comece a executar…

dá print 0, 2 , 4
parou e current = 4 e x = 4

daí suponha que logo antes de ser acrescido 2 a t2 entra em ação… ( depois do print)

x = 4
ela vai achar current = x entao current = 4
dai ela da print

4,6,8,10 e entao volta a t1…

quando ela parou o current = 4 (é variavel local )
daí ela acresce + 2 e printa o 6…

Nao sei se fui claro :stuck_out_tongue: :shock:

iaew pessoas blz… oia eu aqui dinovo… to qse morando aqui no forum… rsss
e q esta perto da minha prova e estou tentando aprender ao maximo =)

bom rodei aqui no eclipse com SO linux…

so consigo obter a letra C como resposta…
rodei varias e varias vezes… e so tenho letra C

gostaria de saber o pq da letra A… não entendi nd =(

Editando…

não tinha a excelete explicação acima qnd postei rss

agora sim entendi… na verdade o proprio agendador decidiu por interromper a t1 e como o t1 não tinha o bloquei do obj pq não e sincronizado t2 comoeçou a executar e foi ate o fim… dai t1 voltou de onde parou e setou x com o valor q estava na variavel current…
assim imprimindo 6… Sinistro…

mais uma vez parabens pela resposta ^^

Essa é punk mesmo… detesto as questoes que tem tu tem que achar “possíveis saídas”… pq dai tu tem que ficar supondo o que o agendador vai fazer…
claro que quando tem assim normalmente eles colocam outras respostas meio bizarras e impossiveis de acontecer, mas igualmente, dá trabalho…

só pra constar, eu fiz o exame segunda feira de noite e essa questão caiu…

Na verdade a letra B é possível sim, embora o cara que fez a prova de certificação talvez não soubesse disso.

A variável x não é volatile e nem está sendo acessada num bloco sincronizado. Portanto, o java está autorizado a fazer uma cópia local da variável em cada thread, um cache.

Com esse cache, é possível que mesmo que a thread1 tenha alterado o valor de x, a thread2 ainda verá seu valor inicial, guardado no cache.

Esse seria um dos erros sinistros, místicos e difíceis de se depurar. Até porque, rodando com o debuggers os caches tendem a desaparecer. E, obviamente, a certificação não cobre detalhes obscuros como esse.

Agora, eu me pergunto o que uma questão dessas realmente quer avaliar. A atenção do candidato? Ou quer só comprovar que um código rebuscado pode ser realmente uma dor de cabeça???

Quem quiser ler mais sobre o assunto:
http://www.javaperformancetuning.com/news/qotm030.shtml

Esse foi o detalhe que faltou em minha análise !

vlw

Interessante essa citação. Estou estudando pra certificação e costumeiramente chego a perguntas similares. Pra ser sincero só continuo os estudos para certificar na esperança de uma certa valorização no mercado de trabalho. Na minha opinião, uma questão dessas deveria estar em alguma prova que avalia a capacidade do candidato de realizar testes de mesa, a fim de achar erros ou resultados absurdos, o que, até onde eu entendo, não passa nem perto dos objetivos da SCJP.