A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 高梦晓 中级黑马   /  2013-4-16 13:33  /  1592 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

代码如下:
  1. public class TT implements Runnable {
  2.     int b = 100;
  3.      
  4.     public synchronized void m1() throws Exception {
  5.         b = 1000;
  6.         Thread.sleep(1000);
  7.         System.out.println("b =" + b);
  8.     }
  9.      
  10.     public synchronized void m2() throws Exception {
  11.         Thread.sleep(3000);
  12.         b = 2000;
  13.     }
  14.      
  15.     public void run() {
  16.         try {
  17.             m1();
  18.         } catch(Exception e) {
  19.             e.printStackTrace();
  20.         }
  21.     }
  22.      
  23.     public static void main(String[] args) throws Exception {
  24.         TT tt = new TT();
  25.         Thread t = new Thread(tt);
  26.         t.start();
  27.         tt.m2();
  28.                 Thread.sleep(5000);
  29.         System.out.println(tt.b);
  30.     }
  31. }
复制代码
结果如下:
    b =10001000

我是这样分析的: t线程开始, 调用run(), run()里面调用m1()方法, m1方法被锁定, b赋值为1000, 然后睡眠1000毫秒
打印b = 1000 , 接着调用m2(), m2()方法被锁定,因为只有m1()执行完才能执行m2(), 刚才m1()执行完了, m2睡眠3000毫秒,
然后b赋值为2000, 主线程睡眠5000毫秒, 然后输出tt.b为2000 , 但是结果为什么是1000呢 ? 不是在m2()里面b被赋值为2000了吗?







评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

3 个回复

倒序浏览
本帖最后由 沈浩 于 2013-4-16 15:05 编辑

     

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

        TT tt = new TT();

        Thread t = new Thread(tt);

        t.start();//启动线程 获得执行资格 但此时并没执行权  执行权在主线程那里    所以此时并没立刻执行run   当该线程获得cpu执行权时就会去运行run;   

                              如果想看到效果你可以让主线程放弃执行权     在下面加一句//Thread.sleep(10);         这样就可以手动看到你想的效果了      
                    其实主要看cpu做着怎样的切换     有可能一获取到执行资格   cpu就切换到该线程了
                    所以通过分析   上面的问题应该可以解决了吧

        tt.m2();

                Thread.sleep(5000);

        System.out.println(tt.b);

    }

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
如果问题未解决,请继续追问,如果问题解决了,请将问题分类改为“已解决”,谢谢
回复 使用道具 举报
因为主程序先执行的是tt.m2(),再执行的run方法,可以将 Thread.sleep(5000)提到tt.m2()之前,这样m2就可以后执行了

上面的同学已经解释了,我就不多说了,建议你在m2中加一句
public synchronized void m2() throws Exception {
        Thread.sleep(3000);
        b = 2000;
        System.out.println("ok");
    }
这样你就能很好理解了

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马