走っているスレッドを考えよう。
まず、main関数のスレッド。それと、君が立ち上げた"th1"スレッド。

threadTestStartの先頭でth1スレッドが立ち上がって、
synchronized(this)とsynchronized(this.loop)をロックし続ける。それは問題なし。

その次、threadTestStartでmg1.print();が呼ばれる。これも問題ない。
なぜなら、Mage#print()メソッドはsynchronizedによってロックされていないからだ。
同様に、mg1.printLoop();も呼ばれ、eurtを出力する。
そして、最後にSystem.out.println(mg1.getLoop().reverse());が実行され、trueを出力する。
これでmainスレッドは終わり。そして、th1スレッドは永遠ループにはいる。

だからその出力結果はおかしいはず。
print()
eurt
true
<無限ループ>
のはずなんだが、俺の勘違いかな…テストしてないので自信がない