public class TT implements Runnable {
int b = 100;
public synchronized void m1() throws Exception {
b = 1000;
Thread.sleep(2500);
System.out.println("b = " + b);
}
public synchronized void m2() throws Exception {
Thread.sleep(5000);
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();
System.out.println(tt.b);
}
}
最后打印的结果是
b =1000
1000
请问这个程序的执行顺序是怎么样的
m1() m2()这两个方法都被synchronized修饰是他们是怎么执行的
m1,m2执行顺序是不确定的。没有顺序可言,关键是thread.sleep后,谁先被唤醒。
这程序只能说先唤醒执行m1的概率高,所以打印出tt.b是1000,实际上几种组合都有可能。
System.out.println("b = " + b);打印出b=2000都可能。
但是这个程序的打印过程是
先等待2.5秒 然后输出一个1000
然后再等待5秒 输出一个b = 1000
所以我还是没有弄懂他的执行过程 那b=2000这个赋值去了哪里
首先System.out.println("b = " + b)这个输出的b肯定是1000,System.out.println(tt.b)这个输出的可能是1000可能是2000,看m1,m2执行顺序
其次这两个输出的前后顺序也不确定
线程开起的是m1,,,,m2并没有调用线程
程序执行时,系统会分配时间片,系统自动调用程序。执行长短不一定。