bromzh прав, от себя добавлю что есть ещё состояние гонки и оба потока могут обращаться к одному и тому же файловому дескриптору, в данном случае STDOUT, - нет гарантии что оба потока не будут писать EGG и END одновременно и не получится абракадабра типа EEGNG !D ;)
Подобное поведение характерно для любой многопоточности, и Java тут не причём.
Для избавления от головной боли используют модели актёров и Share nothing подходы типа всяких Akka, Greenlet'ов или процессов в Erlang'е, но на определённом этапе и с ними начинаются проблемы.