- 同一个对象在两个线程中分别访问该对象的两个同步实例方法——会产生互斥
- 不同对象在两个线程中分别调用同一个同步实例方法——不会互斥
- 用类直接在两个线程中调用两个不同的同步静态方法——会产生互斥
- 用一个类的静态对象在两个线程中调用同步静态方法——会产生互斥
- 一个对象在两个线程中分别调用一个同步静态方法和一个同步实例方法——不会产生互斥
结论:
- 静态方法的锁和实例方法的锁,默认是不同的对象锁,不会互斥
- 静态方法加锁,能和该类中所有用synchronized修饰静态方法的相互互斥,和未用synchronized修饰的静态方法不互斥
- 静态方法锁实际是对类对象加锁,实例方法加锁实际是对实例对象加锁
下面有一个实例展示:
pulbic class Something(){
public synchronized void method1(){}
public synchronized void method2(){}
public static synchronized void staticMethod1(){}
public static synchronized void staticMethod2(){}
}
创建x和y两个实例
x.method1()与x.method2() 会互锁,同一个实例,普通成员方法如果被synchronized修饰会互锁
x.method1()与y.method2()不会互锁,不同实例,被synchronized修饰的普通方法八竿子打不着
x.staticMethod1()与y.staticMethod2()会互锁,静态方法被synchronized修饰是对类进行加锁
x.method1()与Something.staticMethod1()不会互锁,静态方法的锁和实例方法的锁,是不同帮派