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了吗?
可以在
t.start();
tt.m2();
之间加入个sleep来保证t先执行
就是说, 如果在t.start();和tt.m2();之间不加sleep的话, 这个tt.b有可能是1000, 有可能是2000,
因为在默认的优先级情况下, 不能保证谁先谁后, 是这个道理吧?我刚才调试了一下, 发现tt.b有时为2000, 有时为1000
刚才那个帖m2()方法没有加锁, 这个帖里面, m1和m2都设置为同步了
就是这个意思,线程的执行是随机的,start不代表就立即执行。
主线程先调用m2,b=2000,然后主线程sleep(5000),这时t线程启动执行m1,b=1000,然后t线程打印1000,执行结束,主线程sleep时间到,打印tt.b,因为b已经被t修改了,所以是1000
刚才看了一下视频里的分析, 马士兵是这样说的:
main程序执行到start, 分出一进程t, run方法执行m1()往下执行, 然后main程序往下执行
于是到了tt.m2()这句, 由于m2()锁死, m1()只能等到m2()执行完才能执行它的一下句子于是m2()执行, m2()睡眠2500毫秒之后 b被赋值为2000, 好了, m2()执行完了,这个时候m1()才能开始
执行, 于是m1()里面 b的值又被赋值为1000, 赋值之后m1()开始睡眠5000秒(按照源代码来),
睡眠期间, 现在开始执行main里面的println . 于是打印了tt.b为1000, 然后执行m1()里面的println,
于是接着打印 b = 1000 ;
在main程序里面, 主线程的优先级是否大于其他线程优先级呢?