java для синхронизации, другой выход resilts

почему есть разница в выходной.у меня 2 случая. 1.в первом случае я использовал статические функции f1 и f2

 public static synchronized void f1() {     for(int i=0; i< 100; i++)         system.out.print("a"); }    public static synchronized void f2() {     for(int i=0; i< 100; i++)         system.out.print("b"); }   

вот мое основное тело способ: нити т1 = новый поток( новый runnable(){общественная пустота запустить(){ф1()

    thread t2 = new thread(    new runnable(){public void run(){f2();}}    );    t1.start();    t2.start();

выход aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb

<литий><p>на втором случае f1 и f2 не являются статичными </р><р>общественного синхронизированы недействительными ф1() { для(int я=0

вывод такой бардак.aaabababbbbaaaaaaaaaabbaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbaa