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

还是关于synchronized这个关键字的使用!!!急急急急急
public class TT implements Runnable{
int b=100;
 
public synchronized void m1(){
b=1000;
try{
Thread.sleep(5000);
}catch(Exception e){
e.printStackTrace();
}
System.out.println("b="+b);
}  

public synchronized void m2(){
b=2000;
try{
Thread.sleep(2500);
}catch(Exception e){
e.printStackTrace();
}
}

public void run(){
try{
m1();
}catch(Exception e){
e.printStackTrace();
}  
}

public static void main(String args[]){
TT tt = new TT();
Thread t = new Thread(tt);
t.start();
tt.m2();
System.out.println(tt.b);
}
}

这个程序得到的结果是什么 为什么??? 不要只说结果啊,关键是为什么,然后得到的结果是固定的只有一个结果吗?还是有可能有不同的结果,和CPU是双核什么的有关系吗??? 这个问题困扰我两天了!!,马士兵讲堂上说的感觉也没有说清楚,我要详细答案!!!!

------解决方案--------------------
如果m2 sync之后给你解释一下
main执行到tt.start()时,有两种可能,一种是立即启动,一种是准备好,就绪状态,暂时不启动。
启动事实也有可能是在tt.m2()之后启动,因为tt.m2()是主线程的一部分,不好说谁先启动的,这个跟代码前后没太大关系的,(你可以设置优先级或者让两代码之间加点废话,这另说)

关键就看谁先启动了,只要有一个启动的,就会锁住当前对象TT,另外一个线程的另外一个方法的运行也需要锁对象,但是已经被提前锁了,所以只能等当前线程执行完在执行。结果就有很多种了
1:tt.start(); tt.m2(); 这样的结果是
b=1000
2000

2:tt.m2(); tt.start(); 主程序输出;
结果b=1000
1000

3:tt.m2(); 主程序的输出; tt.start;
结果
2000
b=1000