Confusão com Threads

[code]import java.util.*;

public class NameList1 {
private List names = new ArrayList();

public synchronized void add(String name) {
	names.add(name);
}

public synchronized void printAll() {
	for (int i = 0; i < names.size(); i++) {
		System.out.print(names.get(i) + " ");
	}
}

public static void main(String[] args) {
	final NameList1 sl = new NameList1();
	for (int i = 0; i < 2; i++) {
		new Thread() {
			public void run() {
				sl.add("A");
				sl.add("B");
				sl.add("C");
				sl.printAll();
			}
		}.start();
	}
}

}

/*
Which two statements are true if this class is compiled and run?
(Choose two.)
A. An exception may be thrown at runtime.
B. The code may run with no output, without exiting.
C. The code may run with no output, exiting normally.
D. The code may rum with output ?A B A B C C ?, then exit.
E. The code may rum with output ?A B C A B C A B C ?, then exit.
F. The code may ruin with output ?A A A B C A B C C ?, then exit.
G. The code may ruin with output ?A B C A A B C A B C ?, then exit.
Answer: EG
*/

[/code]

A, B, C e D, blz… erradas mesmo… mas por que não a F??

Se alguma alma piedosa puder esclarecer vou ficar muito contente!!

[]'s!

Acho que não entendi tbm, mas já vou aproveitar pra tirar uma dúvida…hehehe

Até onde entendo, estão sendo criadas duas threads, correto ?(além da main).

Cada uma vai executar uma vez o trecho de código do método run…logo, s1 só pode conter duas vezes cada letra…ou não?

Ah ta, já saquei, minha dúvida, rs. O que pode acontecer é a primeira thread executar tudo primeiro, imprimindo A B C e então a outra adiciona A B C e imprime tudo de novo…agora to verificando a dúvida inicial do tópico. :slight_smile:

Bom, acho que saquei porque a F está errada…

Veja, para começar a imprimir algo, seja qual for a thread, ela vai ter que ter adicionado já as tres letras A B e C, por que o método que imprime vem depois do add dessa tres letras…logo é impossível que a saída na tela comece com 3 letras A…no máximo vai haver duas letras A em s1 quando um dos métodos de impressão começar a imprimir…
Bom, não entendi pq a G tbm é correta…

rod.attack, Creio que você esteja correto, a G é possível sim… se o primeiro Thread adicionar ABC e antes de printar o segundo Thread tiver adicionado o seu A o primeiro vai escrever ABCAA, depois disto o segundo Thread adiciona o seu BC e imprime ABCABC, realmente é impossível três A’s logo de cara, e digo mais acho que não é possível uma sequência de três letras iguais na saída… Se mais alguém puder opinar vai ser legal!!
Obrigado!