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

新手线程同步问题,帮忙解释一些结果。。
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呢

------解决方案--------------------
Thread.sleep(5000);
改成
Thread.sleep(1000);
试试看?

你同步的是m1方法,不是b变量。
------解决方案--------------------
要点主要是:前后只有一个 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);
------解决方案--------------------
个人浅见,仅供参考:

楼主要试同步效果的话,要把m2()也加上synchronized,才能体会到同步的效果。
只有m1()加上synchronized ,与不加从结果上看是一样的, 没有同步的效果。

m2()加上synchronized 后,可以在t.start();后,加一个几毫秒的睡眠(具体几毫秒,可以选1到10),会看到随机的结果,更能体会到synchronized 的效果。
Java code

t.start();
  Thread.sleep(1);   //可调整这个时间,会看到线程调度和synchronized的作用。
tt.m2();