Dúvida questão Thread - TestKiller

Boa tarde a todos,

Segundo o TestKiller a resposta correta é a letra E e G, se alguém puder ajudar explicando o fluxo, não estou entendendo direito no caso da letra G como esse resultado acontece… Fiz alguns teste e alem da letra E, obtive o seguinte resultado: A A B B C C A A B B C C

import java.util.*;

public class NameList {
 	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 NameList sl = new NameList();
		for(int i=0;i<2;i++) {
 			new Thread() {
 			public void run() {
 				sl.add("A");
 				sl.add("B");
 				sl.add("C");
 				sl.printAll();
 			}
 			}.start();
 		}
 	}
 }
/*
Question 126
Click the Exhibit button.
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
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
*/

Desde já agradeço…

primeira thread
sl.add(“A”);
sl.add(“B”);
sl.add(“C”);

<< interrupção >>

segunda thread
sl.add(“A”);

<< interrupção >>

primeira thread
sl.printAll(); // A B C A

<< finaliza primeira thread >>

segunda thread
sl.add(“B”);
sl.add(“C”);
sl.printAll(); // A B C A B C

<< finaliza execução >>

Agora eu entendi…
Obrigado…