lzxiaoguigui 2012-12-17 22:54
浏览 212
已采纳

请教一个java线程的一个小问题,求程序执行流程,打印结果为1000 b=1000

public class Test implements Runnable{
int b = 100;
public synchronized void m1() throws Exception{
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{
Test tt = new Test();
Thread t = new Thread(tt);
t.start();
tt.m2();
System.out.println(tt.b);
}
}[size=xx-small][/size]

  • 写回答

2条回答 默认 最新

  • henghanan 2012-12-18 02:37
    关注

    打印结果有两种情况:
    1、 1000 b:1000
    2、 2000 b:1000

    解释:这个程序启动了两个线程,一个是main线程,另一个是在main中启动的线程:t.start(),假设为t线程。线程启动需要一点时间,所以main线程先调用m2方法,因为m2是synchronized方法,[color=red]被synchronize 修饰的方法(块)是原子操作,保证了在同一时间只有一个线程执行[/color],所以当m2方法执行完成后,t线程才可以执行,这时,main线程和t线程并发执行了,分两种情况:
    1、如果t线程执行的快,先调用m1方法,把b设为1000,然后休眠5000毫秒,此时main线程打印tt.b的值,为1000
    2、如果main线程执行的快,就会先打印bb.t的值,为2000,然后t线程调用m1方法
    由于t线程休眠了5000毫秒,最后b的值为1000

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 微信会员卡接入微信支付商户号收款
  • ¥15 如何获取烟草零售终端数据
  • ¥15 数学建模招标中位数问题
  • ¥15 phython路径名过长报错 不知道什么问题
  • ¥15 深度学习中模型转换该怎么实现
  • ¥15 HLs设计手写数字识别程序编译通不过
  • ¥15 Stata外部命令安装问题求帮助!
  • ¥15 从键盘随机输入A-H中的一串字符串,用七段数码管方法进行绘制。提交代码及运行截图。
  • ¥15 TYPCE母转母,插入认方向
  • ¥15 如何用python向钉钉机器人发送可以放大的图片?