1。
在一个同步化的静态方法执行之前,它会获取与它的Class 对象相关联的一个管程(monitor)锁[JLS 8.4.3.6]。
所以在上面的程序中,主线程会在创建第二个线程之前获得与PingPong.class 相关联的那个锁。只要主线程
占有着这个锁,第二个线程就不可能执行同步化的静态方法。具体地讲,在main 方法打印了Ping 并且执行
结束之后,第二个线程才能执行pong 方法。只有当主线程放弃那个锁的时候,第二个线程才被允许获得这
个锁并且打印Pong 。
package com.yinbodotcc;
public class PingPong{
public static synchronized void main(String[] a)
{
Thread t = new Thread()
{
public void run(){ pong(); }
};
// t.setDemo(true);
t.start();
System.out.println( "Ping" );
}
static synchronized void pong()
{
//while(true)
System.out.println( "Pong" );
}
}
2。如果上面是用t.run()代替t.start()则不是一个多线程了,只是普通方法调用。这个时候打印pong ping
3.上面程序中,我在t.start()上面加入t.setDemo(true),同时pong方法里面用while循环(见红色部分),则
会打印出若干个Pong(不会一个也不打印,也不是一直打印下去)