当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
分几种情况:
1.其他方法前是否加了synchronized关键字,如果没加,则能。
2.如果这个方法内部调用了wait,则可以进入其他synchronized方法。
3.如果其他个方法都加了synchronized关键字,并且内部没有调用wait,则不能。
4.如果其他方法是static,它用的同步锁是当前类的字节码,与非静态的方法不能同步,因为非静态的方法用的是this。
前面三点都好理解,第四点看的我稀里糊涂,完全不懂啥意思。
求更详细的讲解,如果能配合代码就是极好的

------解决方案--------------------
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锁住的对象是不可能相同的,这就是两个方法不能同步的原因。