日期:2014-05-20  浏览次数:20864 次

还是关于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了吗?

------解决方案--------------------
引用:
引用:

start线程不一定马上执行,这里是tt先执行了
可以在
t.start();
tt.m2();
之间加入个sleep来保证t先执行


就是说, 如果在t.start();和tt.m2();之间不加sleep的话, 这个tt.b有可能是1000, 有可能是2000,
因为在默认的优先级情况下, 不能保证谁先谁后, 是这个道理吧?

我……


就是这个意思,线程的执行是随机的,start不代表就立即执行。