public class ad13 implements Runnable
{
int b = 100;
public static void main(String[] args) throws Exception{
ad13 a = new ad13();
Thread t = new Thread(a);
t.start();
Thread.sleep(1000);
a.m2();
}
public synchronized void m1()
{
this.b = 2000;
try
{
Thread.sleep(5000);
System.out.println("b = " + b);
} catch(InterruptedException e){
e.printStackTrace();
}
}
public void m2()
{
this.b = 1000;
}
public void run()
{
m1();
}
}
这段输出的值是1000。
public synchoronized void m2()
{
this.b = 1000;
}
如果再加上synchronized的话,输出是2000. 关于锁定当前对象 是怎样个理解,有点混了,求详细讲解一下~
这里跑的是两个线程,一个是main的线程,一个是t的线程。
楼主一开始只锁了m1,因为main线程没有调用m1,所以相当于没有竞争。就是t先执行m1,改成2000,然后sleep;main也sleep了一秒,然后改成1000,这时候t还没起来,等t起来的时候b已经是1000了,所以输出是1000。
如果在m2加上synchronized,那么main和t就有竞争关系。t先获得锁,所以main要等m1释放了才能执行m2,所以会先输出2000,m2才会把b改成1000.