public class BB implements Runnable{
int b=100; public synchronized void m1() throws Exception{
b=1000;
Thread.sleep(5000); System.out.println("b="+b);
} public void m2() throws Exception {
Thread.sleep(2500);
b=2000;
} public void run(){
try{
m1();
}catch(Exception e){
e.printStackTrace();
}
} public static void main(String[] args) throws Exception{
BB tt=new BB();
Thread t=new Thread(tt);
t.start(); tt.m2(); System.out.println(tt.b);
}
}
为什么运行的结果是:
2000
b=2000
而不是2000   b=1000呢

解决方案 »

  1.   

    Thread.sleep(5000);
    改成
    Thread.sleep(1000);
    试试看?你同步的是m1方法,不是b变量。
      

  2.   

    要点主要是:前后只有一个 tt=new BB() 实例,所以修改的对象都是同一个 tt.b
    m1() 先执行了 tt.b = 1000; 然后就要sleep 5秒期间 tt.m2() 函数中,sleep了2.5秒,就把 tt.b 修改为2000,函数结束
    紧接着执行主函数中的:System.out.println(tt.b);然后 m1() 又睡过了2.5秒(总计5秒),才开始输出System.out.println("b="+b);
      

  3.   

    个人浅见,仅供参考:楼主要试同步效果的话,要把m2()也加上synchronized,才能体会到同步的效果。
    只有m1()加上synchronized ,与不加从结果上看是一样的, 没有同步的效果。m2()加上synchronized 后,可以在t.start();后,加一个几毫秒的睡眠(具体几毫秒,可以选1到10),会看到随机的结果,更能体会到synchronized 的效果。t.start();
      Thread.sleep(1);   //可调整这个时间,会看到线程调度和synchronized的作用。
    tt.m2();