public class TT implements Runnable {
int b = 100;

public synchronized void m1() throws Exception{
//Thread.sleep(2000);
b = 1000;
Thread.sleep(5000);
//System.out.println("b = " + b);
}

public synchronized void m2() throws Exception {
Thread.sleep(6000);
b = 2000;
//System.out.println("b = " + b);
}

public void run() {
try {
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();

tt.m2();
System.out.println(tt.b);
}
}为什么执行结果是1000,不应该m2是休眠6s,比m1要长,他应该是最后修改数据的,应该是2000啊!哪位大侠帮忙一下啊!

解决方案 »

  1.   

    t.start(); 并不是马上开始,应该是放到线程池中,处于等待状态。等着被CPU调度
      

  2.   

    在一次结速后在跑一次就是2000了,你用了synchronized,在run方法中的m1先运行,在运行m2,但很有可能第一次运行是程序被jvm给结速了,多线程问题很搞,还看高手在答
      

  3.   

    在m1和m2的开头各加上一句print就明白了。
    实际上m2先获得执行。
    m2执行后,释放锁,m1得到执行的许可,所以m1的执行应该发生在:
    tt.m2();
    System.out.println(tt.b); 
    这两句话之间。
      

  4.   

    package demo;public class TT implements Runnable {
    int b = 100; public synchronized void m1() throws Exception {
    System.out.println("m1 before b = " + b);
    b = 1000;
    Thread.sleep(5000);
    System.out.println("m1 after b = " + b);
    } public synchronized void m2() throws Exception {
    System.out.println("m2 before b = " + b);
    Thread.sleep(9000);
    b = 2000;
    System.out.println("m2 after b = " + b);
    } public void run() {
    try {
    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();
    // Thread.sleep(1000);
    tt.m2();
    System.out.println("TT.b = " + tt.b);
    }
    }
    我改了点 你再跑跑看 就知道问题了   
    注释的部分  注释和不注释的话  结果是不一样的
      

  5.   

    出现1000的结果是因为,你用了 synchronized 当 tt抢到执行权后,就先执行 m2,就暂停 6秒,tt就阻塞了. 于是轮到线程t执行,因为遇到synchronized了,就发现tt还没有执行完,tt没有释放锁,所以 t不能继续执行.一直要等到 tt执行完后才能执行 m1.
     在这段程序中如果加了 synchronized 就不会出现你期望的一个是暂停6秒一个暂停5秒,应该5秒先结束的情况.
      如果不加synchronized 就铁定是你期望的2000t.start();tt.m2(); 
    实际这两句,不一定谁先执行的. 
      

  6.   

    m2拿了对象锁说,我去睡6秒,回来干完事再把锁还给你^_^m1干着急:你拿着锁我不能干事啊!我干完才睡觉,应该先给我才对啊!CPU说:一边凉快去,锁给谁我说了算!
      

  7.   

    ^_^ 其实不是CPU说了算,而是JVM和OS的线程调度,不过为了简便,就写CPU啦!