package com.syn;public class TT implements Runnable { int b = 100; public static void main(String[] args) throws Exception {
TT t = new TT();
Thread t1 = new Thread(t);
t1.start();
t.m2();
Thread.sleep(6000);
System.out.println("m2" +" :" +t.b);
} @Override
public void run() {
try {
m1();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } public synchronized void m1() throws Exception {
b = 1000;
Thread.sleep(5000);
System.out.println("m1" +" :" +b); } public synchronized void m2() throws InterruptedException {
Thread.sleep(1000);
b = 2000;
System.out.println("m2" +" :" +b);
}
}为什么 最后输出的是1000??,在线程2的时候应该已经改了的呀?

解决方案 »

  1.   


    t1.start();
    t1.join();
    t.m2();
      

  2.   

    最好变量b 加上关键字 volatile
      

  3.   

    好像类似,看看这个:
    http://topic.csdn.net/u/20120922/15/de48b338-83b1-4203-bf3f-d7b93add5b35.html
      

  4.   

    由于加了synchronized关键字, 所以只需要考虑是m1先被执行还是m2先被执行。里面的那些sleep都是浮云,不会在sleep的过程中被其他线程抢占,因为被锁住了。
      

  5.   


    我想问,是不是m2的线程已经把b这个变量锁住了呀,所以m1只能等m2走完,才能拿到b阿,如果 是这样的话就可以说得通了,那么m2走在前面的话就是2000,然后m1是1000, 最后输出就是1000
      

  6.   

    原来如此,我终于明白了,synchronized 是将整个当前对象锁起来,那么第二个线程调用该对象的此同步方法或者其它同步方法时,要等第一个同步方法执行完才能被执行,当然不会影响到其它非同步方法,参考这个的
    http://topic.csdn.net/u/20120618/19/62eef5ad-648d-4a2e-bf33-28ca3978a793.html?r=78896940
      

  7.   

    主线程main与子线程的执行顺序问题。
    加上t1.join();
    等待子线程执行完毕后执行主线程赋值。
    执行顺序和sleep没有关系。