Thread

14 respostas
marciorodr0
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
*/

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??

14 Respostas

Djonatah

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

Prudencio

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:

LPJava

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.

Djonatah

Eu não tenho tanta certeza quee acertei…hehehe

C

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:

maior_abandonado

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…

C

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

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

gustavobs

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:

Jeferson_Manetti

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 ^^

gustavobs

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…

maior_abandonado

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

ViniGodoy

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

C

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

vlw

rodrigo.bossini

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.

Criado 24 de janeiro de 2009
Ultima resposta 4 de fev. de 2009
Respostas 14
Participantes 10