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]
请教一个java线程的一个小问题,求程序执行流程,打印结果为1000 b=1000
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
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本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥15 微信会员卡接入微信支付商户号收款
- ¥15 如何获取烟草零售终端数据
- ¥15 数学建模招标中位数问题
- ¥15 phython路径名过长报错 不知道什么问题
- ¥15 深度学习中模型转换该怎么实现
- ¥15 HLs设计手写数字识别程序编译通不过
- ¥15 Stata外部命令安装问题求帮助!
- ¥15 从键盘随机输入A-H中的一串字符串,用七段数码管方法进行绘制。提交代码及运行截图。
- ¥15 TYPCE母转母,插入认方向
- ¥15 如何用python向钉钉机器人发送可以放大的图片?