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. 关于锁定当前对象 是怎样个理解,有点混了,求详细讲解一下~

解决方案 »

  1.   

    我的理解是 如果一个线程启动,调用了synchronized的方法时,锁定了当前的对象,其他加了synchronized的方法必须等这个方法执行结束才能调用,是这样吗?
      

  2.   

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

  3.   

    谢谢,t先获得锁,所以main要等m1释放了才能执行m2
    那加synchronized分别是两个方法,main和t是两个线程吧,m1只锁住了t,但是为什么main不能访问m2呢?
      

  4.   

    就是我的理解:加了synchronized是锁定当前方法只有一个线程来访问,任何线程都要等这个方法执行完才有机会访问这个方法,但是main和t是两个线程,synchronized分别是两个方法,这里想不懂,为什么要等m1执行完main才可以访问m2
      

  5.   

    synchronized只有两种形式,类锁和对象锁,static修饰的是类锁,整个类共享的;而其他的都是对象锁。
    你这种属于对象锁,就是说一个对象只有一把锁,锁住的是整个对象。
    所以,当t进入m1的时候,获得a的锁,main执行m2的时候,也需要获取a的锁,但是a的锁被t占用了,所以要等t释放了,main才能获取锁执行m2