线程 synchronized

sunyimaying1 2010-03-07 10:09:41
public class TT implements Runnable {
int b=100;
public void run() {
try {
m1();
} catch (Exception e) {
e.printStackTrace();
}
}

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

public void m2() throws Exception{
Thread.sleep(2500);
b=2000;
}

public static void main(String[] args) throws Exception {
TT tt=new TT();
Thread t=new Thread(tt);
t.start();

tt.m2();
}
}

输出b=2000;
m2方法前面 synchronized,输出b=1000;

为什么是这两种结果,请大家帮忙分析一下。谢谢
...全文
202 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunyimaying1 2010-03-10
  • 打赏
  • 举报
回复
引用 8 楼 aerter 的回复:
这篇文章对你有帮助的,http://www.phome.asia/forum/thread/22736.html

这篇文章的确不错 十分感谢
miraclezheng 2010-03-08
  • 打赏
  • 举报
回复

推荐看一下马士兵视频-线程那章,里面有讲到这个问题,说这个是一道面试题。
sunyimaying1 2010-03-08
  • 打赏
  • 举报
回复
引用 6 楼 bawgiitx 的回复:
你的问题和synchronized 无关,哈哈,刚刚睡醒,上睡觉理论能看明白吧

你说和synchronized无关,但为什么两次结果不一样?
bawgiitx 2010-03-08
  • 打赏
  • 举报
回复
你的问题和synchronized 无关,哈哈,刚刚睡醒,上睡觉理论能看明白吧
bawgiitx 2010-03-08
  • 打赏
  • 举报
回复
简单点来说
t和tt在同时睡觉前,t把b修改成1000
tt比t早醒,然后tt把b修改成了2000
t醒来后说出b的值
sunyimaying1 2010-03-08
  • 打赏
  • 举报
回复
引用 9 楼 miraclezheng 的回复:
推荐看一下马士兵视频-线程那章,里面有讲到这个问题,说这个是一道面试题。

我就是看这个视频 看到这道题目。不理解所以过来问问
liuyufeng509 2010-03-07
  • 打赏
  • 举报
回复
第一种情况:t.start()启动线程,调用锁定当前对象的方法m1(),得b=1000然后线程睡眠5秒,在此期间,主线程启动,调用m2(),而m2并未锁定当前对象,所以先睡2.5秒再可把b改为2000,主线程结束.五秒后m1醒来继续执行,打印出b,而此时b已经被m2改为了2000,所以打印出了2000;

第二种情况:由于m1,m2都是synchronized的,所以这两个方法不能同时对当前对象进行操作,只有某一方法结束,解除锁定,另一方法才能执行.m1方法被调用后,直到该方法执行结束,才释放资源,所以,打印出的结果必定是b=1000;本情况中,m1,m2方法是异步执行的
nj_dobetter 2010-03-07
  • 打赏
  • 举报
回复
第一种情况,b = 2000 在b=1000; 之后执行,所以输出:b=2000
nj_dobetter 2010-03-07
  • 打赏
  • 举报
回复
第一种情况,b = 2000 在b=1000; 执行,所以输出:b=2000
第二种情况,由于m1和m2都是synchronized的,所以他们的执行是原子的,即不会相互交叉的。在m1中b=1000,之后该线程会一气执行完println,之间不会执行m2的。
stu202060510 2010-03-07
  • 打赏
  • 举报
回复
期待高手解决中。。。。。。。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧