标签:
观察一段代码,是否可以打印出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()之后,打印出了理想的结果!
标签:
原文地址:http://blog.csdn.net/havedream_one/article/details/44935623