Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java锁定静态和非静态方法?_Java_Multithreading_Locking - Fatal编程技术网

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

Java锁定静态和非静态方法?,java,multithreading,locking,Java,Multithreading,Locking,我有下面的类,很少有线程想要访问这些方法。 请澄清以下几点 如果我使用对象实例锁锁定staticMethod方法,那么任何拥有类锁的线程都可以同时访问该方法 class Test { public static synchronized void staticMethod(){ } public synchronized void instanceMethod(){ } } 如果我使用类实例锁锁定instanc

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

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

class Test {

          public static synchronized void staticMethod(){
          }

          public synchronized void instanceMethod(){
          }
}
如果我使用类实例锁锁定instanceMethod方法,那么任何拥有对象锁的线程都可以同时访问该方法

class Test {

          public static synchronized void staticMethod(){
          }

          public synchronized void instanceMethod(){
          }
}

感谢

在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.如果我使用类实例锁锁定instanceMethod方法,那么任何拥有对象锁的线程都可以同时访问该方法吗?这取决于是否有线程将锁置于类实例之上,然后线程拥有对象锁,否则它无法访问它。

不能使用实例对象锁锁定静态方法。无法从静态上下文访问实例成员。