首页 > 解决方案 > Java锁定静态和非静态方法?

问题描述

我有下面的类,并且很少有线程想要访问这些方法。请澄清以下几点。

如果我使用对象实例锁锁定 staticMethod 方法,那么任何拥有类锁的线程都可以同时访问该方法吗?

如果我使用类实例锁锁定 instanceMethod 方法,那么任何拥有对象锁的线程都可以同时访问该方法吗?

class Test {

          public static synchronized void staticMethod(){
          }

          public synchronized void instanceMethod(){
          }
}

谢谢

标签: javamultithreadinglocking

解决方案


在java中加载的每个类都有对应的java.lang.Class实例代表该类,正是该java.lang.Class实例的锁用于保护该类的静态方法。其中 instanceMethod 使用对象锁。请参阅下面方法上的注释

class Test {
           // lock will be on corresponding instance of **java.lang.Class** 
          //representing Test class
          public static synchronized void staticMethod(){
          }
          // lock will be on corresponding Test Class object
          public synchronized void instanceMethod(){
          }
}

关于您的问题:
1.如果我使用对象实例锁锁定staticMethod方法,那么任何拥有类锁的线程都可以同时访问该方法吗?
首先,您不应该用对象锁锁定静态方法,但如果您想用对象锁锁定它,那么代码片段应该如下所示,在这种情况下,任何拥有类锁的线程只能在不使用对象锁时同时访问该方法通过任何其他线程。

 public static void staticMethod(Test test){
       synchronized(test)
        {               }
      }

2.如果我使用类实例锁锁定instanceMethod方法,那么任何拥有对象锁的线程都可以同时访问该方法吗? 这取决于是否有任何线程对 Class 实例进行了锁定,然后线程拥有的对象锁不能访问它,否则它可以。


推荐阅读