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

关于线程里的synchronized
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. 关于锁定当前对象 是怎样个理解,有点混了,求详细讲解一下~
------解决方案--------------------
引用:
我的理解是 如果一个线程启动,调用了synchronized的方法时,锁定了当前的对象,其他加了synchronized的方法必须等这个方法执行结束才能调用,是这样吗?

这里跑的是两个线程,一个是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.