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