public class TT implements Runnable {
int b = 100; public synchronized void m1() throws Exception {
b = 1000;
// Thread.sleep(5000);
System.out.println("b = " + b); } public synchronized void m2() throws Exception {
Thread.sleep(2000);
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);
}
}请问该程序的执行过程,为什么该程序的输出结果有四个,即:2000 b=1000;b=1000 1000;1000 b=1000;b=1000 2000
最好是画个流程图给我,谢谢了
int b = 100; public synchronized void m1() throws Exception {
b = 1000;
// Thread.sleep(5000);
System.out.println("b = " + b); } public synchronized void m2() throws Exception {
Thread.sleep(2000);
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);
}
}请问该程序的执行过程,为什么该程序的输出结果有四个,即:2000 b=1000;b=1000 1000;1000 b=1000;b=1000 2000
最好是画个流程图给我,谢谢了
TT tt = new TT();
Thread t = new Thread(tt);
t.start();//调用run里的m1
tt.m2();//调用m2
System.out.println(tt.b);//输出
第一种2000 b=1000
第二种b=1000 1000
第三种1000 b=1000
第四种b=1000 2000
int b = 100; public synchronized void m1() throws Exception {
System.out.println("m1 invoked");
b = 1000;
// Thread.sleep(5000);
System.out.println("b = " + b); } public synchronized void m2() throws Exception {
System.out.println("m2 invoked");
Thread.sleep(2000);
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);
}
}
同时在这两个线程执行过程中分别有5秒和2.5秒的休眠时间,在这个休眠时间内main主线程可能获取CPU资源,另外两个线程之前未获得CPU的一者也可能会获得CPU资源而执行(但也是不确定的)
Thread t = new Thread(tt); t.start(); 也是一个线程
所以是两个线程再跑
接下来分析四种出现的情况
(1)2000 b=1000
主线程的m2方法先执行,因为方法都是同步的
所以拿到执行m2方法时 该线程(主线程)拿到对象锁,其他线程等待
b被赋值为2000
System.out.println(tt.b);输出2000
接下来t线程执行 m1方法于是输出 b=1000
(2)b=1000 1000
这种就是上面当执行完m2方法b被赋值为2000后不是马上System.out.println(tt.b);
而是先跑t线程执行b被赋值为1000 System.out.println("b = " + b);
再主线程System.out.println(tt.b);
(3)1000 b=1000
在程序执行好tt.m2();
后线程t跑把b=1000时又停了,主线程输出1000后
t线程再跑就输出b=1000
(4)b=1000 2000
就是线程t先跑完 输出b=1000
在执行t2方法是b=2000
在最后输出2000注:同步方法只针对,不同线程调用同一对象的同步放才有用
m1和m2都市同步方法 因为两个线程用的是同一个对象tt
所以当一个线程在执行m1或m2方法时,另一个线程想执行m1或m2方法时必须等待先拿到锁的那个线程执行好
第三种情况 是主线程执行好m2方法了 所以锁释放了,线程t开始跑执行m1方法
至于跑到中间b=1000赋完值后停了 那是因为此时
主线程 System.out.println(tt.b);先执行了 这里没有调用对象tt的同步方法,所以主线程不会等待t把m1方法执行好再执行,可以随时插进来执行
这段程序,有两个线程,一个是主线程,m1和m2是同步方法,当线程t启动时,是主线程继续拥有CPU时间片,还是线程t拥有CPU时间片,(也即问是m1()先执行还是m2()先执行???)
b=1000
1000的结果,这样改一下代码
public static void main(String[] args) throws Exception { TT tt = new TT();
Thread t = new Thread(tt);
t.start();
tt.m2();
Thread.currentThread().sleep(5000);
System.out.println(tt.b);
}
本来你的代码也可以出现这种情况,但不太明显