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(不会一个也不打印,也不是一直打印下去)