关于Java的线程run方法中为全局变量的赋值问题

为什么在run()方法里为sa赋值,在main方法里执行start()后sa没有+1,
其次为什么sName一开始也没变输出结果是“vandeleur”,而在输出t.sa的时候sName却变为“vandeleur 0 1 2 3”

public class Tux extends Thread {
     static String sName = "vandeleur";
     int sa=33;


    public void run() {
        for (int i = 0; i < 4; i++) {
            sName = sName + " " + i;
        }

        sa+=1;
    }

    public static void main(String argv[]) {
        Tux t = new Tux();
        t.start();
        //System.out.println(t.sa); //如果这条注释后则sName为vandeleur
        System.out.println(sName);
    }

}

注释掉System.out.println(t.sa);的运行结果为:
vandeleur

去掉注释System.out.println(t.sa);的运行结果为:
33
vandeleur 0 1 2 3

因为在打印的时候线程未必启动了,所以会出现这种问题,解决办法加上Thread.sleep(time)延迟打印时间

两种情况执行个几十次,你会发现每次的输出结果可能不同

因为对变量的操作和打印是在两个线程里面的。main 方法所在的线程始终处于启动动态,所以先执行了,执行的时候打印的是默认值0.