观察一段代码,是否可以打印出Pingpang:
import java.util.*;
public class Seventysixth{
public static synchronized void main(String[] args){
Thread t = new Thread(){
public void run(){ pang();}
};
t.run();
//t.start();
System.out.print("Ping");
}
public static synchronized void pang(){
System.out.println("pang");
}
}
打印什么?
pang
Ping
在一个同步化的静态方法执行之前,他会获取与它的class对象相关联的一个管程(monitor)锁,所以在上面的程序中,主线程会在创建第二个线程之前获得与class相关联的那个锁。只要主线程占着那个锁,第二个线程就不可能执行同步化的静态方法。具体来讲,在main方法打印了Ping并且结束之后,第二个线程才能执行pang方法。
按照上述所说,不是应该打印出Pingpang吗?
思考下,是否启动了t线程?
t.run和t.start的区别。
t.run只是单纯的一个方法调用,而不是启动线程!!!!
修改成t.start()之后,打印出了理想的结果!