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. 关于锁定当前对象 是怎样个理解,有点混了,求详细讲解一下~
{
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. 关于锁定当前对象 是怎样个理解,有点混了,求详细讲解一下~
楼主一开始只锁了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.
那加synchronized分别是两个方法,main和t是两个线程吧,m1只锁住了t,但是为什么main不能访问m2呢?
你这种属于对象锁,就是说一个对象只有一把锁,锁住的是整个对象。
所以,当t进入m1的时候,获得a的锁,main执行m2的时候,也需要获取a的锁,但是a的锁被t占用了,所以要等t释放了,main才能获取锁执行m2