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(2500);
        b = 2000;
    }
    
    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);
    }
}
这个运行结果是多少??我认为要么是b == 1000 ,1000 ; 要么是2000 , b == 1000 不知道这个结果对不对 各位帮看一下,谢了

解决方案 »

  1.   

    我的意思是这两个结果应该是随机出现的吧 这要看CPU的分配 但运行出来的结果是1000 ,b = 1000 
    这是怎么样回事啊 对这个结果很不能理解
      

  2.   

    两个都有可能的
    public class Test {
        /**
         * @param args
         */
        public static void main(String[] args) throws Exception {
    // TODO Auto-generated method stub
    TT tt = new TT();
            Thread t = new Thread(tt);
            t.start();
            
            tt.m2();
            System.out.println("main():"+tt.b);
        }
    }
    class TT implements Runnable {
        int b = 100;
        
        public synchronized void m1() throws Exception{
            //Thread.sleep(2000);
    System.out.println("m1");
            b = 1000;
            Thread.sleep(5000);
            System.out.println("b = " + b);
        }
        
        public synchronized void m2() throws Exception {
    System.out.println("m2");
            Thread.sleep(2500);
            b = 2000;
        }
        
        public void run() {
            try {
                m1();
            } catch(Exception e) {
                e.printStackTrace();
            }
        }
    }
    改为这样,你就可以看清楚到底是谁获得cpu,我两个结果都出现过
      

  3.   

    你这两个是同步方法,所以就在执行m1或者m2的时候就算sleep了,另外一个方法也执行不了
      

  4.   

    所以应该有3种结果
    1、m1方法先运行,结果为b=1000 2000
    2、m2方法先运行,System.out.print(tt.b)时,b=1000已经执行,结果为1000 b=1000
    3、m2方法先运行,System.out.print(tt.b)时,b=1000未执行,结果为2000 b=1000
      

  5.   

    tt.m2();
    不是线程调动了,而是普通的函数调用了,这是你本来的意图吗??
      

  6.   

    是不是不能说只要用了关键字synchronized修饰一个方法,那该方法就具有原子性
      

  7.   

    随机的吧
    不过我运行了后发现m2一直比m1先运行
    System.out.println(tt.b); 这条语句有时出1000,有时出2000
      

  8.   

    看看这个吧
    http://topic.csdn.net/u/20081123/08/92eafee3-a0e0-4015-b639-76665a64e455.html
    有个回答的很好的 他说了为什么会有两种情况 
      

  9.   

    执行的顺序不应该是
    t.start();
    tt.m2();
    在说了m1()和m2() 都有加synchronized,应该是m1()没有执行完就不会在执行m2()
    m2为什么会先执行呢?