线程考题:当一个线程进入一个对象的一个synchronized方法

线程试题:当一个线程进入一个对象的一个synchronized方法
 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
分几种情况:
     1.其他方法前是否加了synchronized关键字,如果没加,则能。
     2.如果这个方法内部调用了wait,则可以进入其他synchronized方法。
     3.如果其他个方法都加了synchronized关键字,并且内部没有调用wait,则不能。
     4.如果其他方法是static,它用的同步锁是当前类的字节码,与非静态的方法不能同步,因为非静态的方法用的是this。

前面三点都好理解,第四点看的我稀里糊涂,完全不懂啥意思。
  求更详细的讲解,如果能配合代码就是极好的线程考题:当一个线程进入一个对象的一个synchronized方法
------解决方案--------------------

public class A {

/**
 * 静态方法
 */
public synchronized static void staticMethod(){}

/**
 * 实例方法
 */
public synchronized void instanceMethod(){}
public static void main(String[] args) {

//A实例的创建过程
Class c = Class.forName("A");
A a1 = c.newInstance();
A a2 = c.newInstance();
A a3 = c.newInstance();
}
}


如上代码所示,你看一看main方法里面A实例的创建过程,这个要先理解
staticMethod这个静态方法,无法你实例化多少次,它都只是存在一个,就像Class c指向的对象,它在jvm中也只会存在一个,staticMethod方法锁住的是c指向的实例。

instanceMethod这个实例方法,你创建多少个A实例,这些实例都存在各自的instanceMethod方法,这个方法前加synchronized关键词,会锁住该instanceMethod方法所在的实例。如a1的instanceMethod方法会锁住a1指向的实例,a2的instanceMethod会锁住a2指向的实例。

由此得出结论,staticMethod与instanceMethod锁住的对象是不可能相同的,这就是两个方法不能同步的原因。