java中非静态成员方法和静态成员方法的互锁问题

  1. 同一个对象在两个线程中分别访问该对象的两个同步实例方法——产生互斥
  2. 不同对象在两个线程中分别调用同一个​同步实例方法——不会互斥
  3. 用类直接在两个线程中调用两个不同的同步静态方法——产生互斥
  4. 用一个类的静态对象在两个线程中调用同步静态方法——产生互斥
  5. 一个对象在两个线程中分别调用一个同步静态方法和一个同步实例方法——不会产生互斥

结论:

  1. 静态方法的锁和实例方法的锁,默认是不同的对象锁,不会互斥
  2. 静态方法加锁,能和该类中所有用synchronized修饰静态方法的相互互斥,和​未用synchronized修饰的静态方法不互斥
  3. 静态​方法锁实际是对类对象加锁,实例方法加锁实际是对实例对象加锁

下面有一个实例展示:

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()不会互锁,静态方法的锁和实例方法的锁,是不同帮派

综上:

synchronized修饰的静态方法和非静态方法之间永远不会互锁;

synchronized修饰的非静态方法的锁是实例对象;

synchronized修饰的静态方法的锁是类

发布了58 篇原创文章 · 获赞 0 · 访问量 1002

猜你喜欢

转载自blog.csdn.net/Mason97/article/details/104339384