日期:2014-05-20  浏览次数:20749 次

新手求解。。。。synchronized 的问题。。。
Java code

public class TT implements Runnable {

 int b = 100;
 public synchronized void m1() throws Exception {

  // Thread.sleep(2000);
  System.out.println("m11");
  b = 1000;

  Thread.sleep(5000);

  System.out.println("m12");

 }
 public synchronized void m2() throws Exception {
  System.out.println("m21");
  Thread.sleep(2500);
  b = 2000;
  System.out.println("m22");
 }

 public void run() {

  try {
   System.out.println("run");
   m1();
  } catch (Exception e) {

   e.printStackTrace();

  }

 }

 public static void main(String[] args) throws Exception {

  TT tt = new TT();

  Thread t = new Thread(tt);

  t.start();//run();

  tt.m2();

  System.out.println(tt.b);

 }

}


请问为什么运行的结果是m21 run m22 m11 1000 m12
run()比m2()还慢运行????

------解决方案--------------------
这个多线程的时候并不能看表面上应该是谁运行的,因为一旦是多线程就涉及到抢占CPU以及其他资源的问题,虽然你启动了线程,然后系统的确是会去执行run方法,但是并不能保证把run方法里的全部语句都执行完,也有可能是在执行run方法里的m1方法之前CPU就被分配去执行m2方法了的,就想操作系统里的时间片的那种说法哈~一个时间片结束了,但是这个方法还没执行完照样也会去执行其他线程里的语句的呢~
------解决方案--------------------
http://blog.csdn.net/mengxiangyue/article/details/6871219
线程同步问题
------解决方案--------------------
这个跟cpu设定的时间片有关系应该是,main线程先使用一个时间片执行了System.out.println("m21");
然后轮到t.start()去执行System.out.println("run");
每次都是main先使用一个时间片,然后才是启动的线程
------解决方案--------------------
关键在于理解synchronized(同步)。m1和m2都加synchronized运行时必须先m2运行完结,再运行m1。m1或者m2其中一个不加synchronized运行不需要“等”。。。