黑马程序员技术交流社区
标题:
关于synchronized锁,帮忙分析下
[打印本页]
作者:
高梦晓
时间:
2013-4-16 13:33
标题:
关于synchronized锁,帮忙分析下
代码如下:
public class TT implements Runnable {
int b = 100;
public synchronized void m1() throws Exception {
b = 1000;
Thread.sleep(1000);
System.out.println("b =" + b);
}
public synchronized void m2() throws Exception {
Thread.sleep(3000);
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();
Thread.sleep(5000);
System.out.println(tt.b);
}
}
复制代码
结果如下:
b =1000
1000
我是这样分析的: 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了吗?
作者:
沈浩
时间:
2013-4-16 15:00
本帖最后由 沈浩 于 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);
}
作者:
黄玉昆
时间:
2013-4-18 20:19
如果问题未解决,请继续追问,如果问题解决了,请将问题分类改为“已解决”,谢谢
作者:
此生遇你已很美
时间:
2013-4-19 16:37
因为主程序先执行的是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");
}
这样你就能很好理解了
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2