Questão sobre Thread!

Alguém sabe me explicar pq esse código add 03 vezes ao invéz de 02 ???

[code]
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();
		
		
	}
}

}

[code]

A saída disso é:
"A B C A B C A B C " ou
"A B C A A B C A B C "

Na primeira execução do método printAll imprime A,B,C e na segunda vez a lista contém A,B,C,A,B,C . Daí o resultado A B C A B C A B C