public class TestSyn implements Runnable{
public int b=3000;
public void m1() throws Exception{
//System.out.println("b="+b);
b-=1000;
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName()+"b===="+b);
}
public synchronized void m2()throws Exception{
b-=2000;
Thread.sleep(5000);
System.out.println("b==========="+b);
}
public void run(){
try{m2();
}catch(Exception e){e.printStackTrace();}
}
public static void main(String[] args) throws Exception{
TestSyn t=new TestSyn();
Thread t1=new Thread(t);
t1.setName("t1-----");
t1.start();
Thread.sleep(1000);//主线程睡眠1秒,以保证线程t1先执行
t.m1();
System.out.println("b========================="+t.b);
}
}
以上程序主线程睡眠1秒,所以线程t1先执行,赋值b-=2000;b的值变成1000
后进入睡眠Thread.sleep(5000);
这是主线程睡眠1秒后执行t.m1();b的值变成0
运行结果
mainb====0
b=========================0
b===========0
如果m1方法也同步后,即
public synchronized void m1() throws Exception{
//System.out.println("b="+b);
b-=1000;
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName()+"b===="+b);
}
这是线程t1先执行,b-=2000;后b的值为1000,睡眠5秒;m1也同步了,他们都对b的值进行修改,所以必须等m2执行完后再执行m1方法。
运行结果:
b===========1000
mainb====0
b=========================0