一个Synchronized程序结果得疑问
public class TestTT 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){}
}
public static void main(String args[])throws Exception{
TestTT tt = new TestTT();
Thread t = new Thread(tt);
t.start();
tt.m2();
System.out.println(b);
}
}
===============================
这里面结果是2000,b=2000,当m2被synchronized修饰以后结果就变成1000,b=1000,我怎么都分析不大明白这个程序得执行过程,谁能帮我解释清楚?
------解决方案--------------------首先,当m1和m2方法都设为synchronized了之后 把该类this变量作为同步锁的线程无法同时访问这两个方法,也就是说同时有且只有一个线程能访问其中任一个方法。这里有两个线程 thread-t 和thread-main
1)thread-main 先进入了m2方法 b被赋为2000 随后 thread-main离开了m2方法
2)一等thread-main离开了m2方法,即释放了同步锁this,thread-t就能拿到同步锁,同时进入了m1方法,b随即被赋为1000,然后沉睡5秒,该线程进入sleep状态
3)这时thread-main正好进入执行打印语句段,打印出了b,b值为1000
4)thread-t睡眠结束,进入打印语句,打印出了b,b值为1000
over!
------解决方案--------------------不好意思,我对synchronized理解错误. 看了楼上说的恍然大悟.
在我机器上tt.m2()释放锁后,System.out.println(tt.b)在m1()前执行,所以打印出来总是2000,b=1000.
我在tt.m2()后加上Thread.sleep(1000),结果就是1000,b=1000了
sorry~