Java锁定静态和非静态方法?

时间:2019-02-13 04:35:26

标签: java multithreading locking

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

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

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

class Test {

          public static synchronized void staticMethod(){
          }

          public synchronized void instanceMethod(){
          }
}

谢谢

1 个答案:

答案 0 :(得分:0)

java中加载的每个类都具有表示该类的 java.lang.Class 对应实例,这是 java.lang.Class 实例,其锁用于保护类的静态方法。 as 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. 如果我使用Class实例锁来锁定instanceMethod方法,那么任何拥有对象锁的线程都可以同时访问该方法?这取决于是否有任何线程对Class实例施加了锁,然后线程拥有Object锁可以否则将无法访问。