当给main加上synchronized

    技术2022-05-11  126

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


    最新回复(0)