当前位置: 代码迷 >> java >> Java 锁定静态和非静态方法?
  详细解决方案

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

热度:122   发布时间:2023-07-27 09:47:48.0

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

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

如果我使用 Class instance lock 锁定 instanceMethod 方法,那么任何拥有 Object lock 的线程都可以同时访问该方法吗?

class Test {

          public static synchronized void staticMethod(){
          }

          public synchronized void instanceMethod(){
          }
}

谢谢

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.如果我使用 Object 实例锁来锁定 staticMethod 方法,那么任何拥有类锁的线程都可以同时访问该方法吗?
首先,你不应该用对象锁来锁定静态方法,但如果你想用对象锁来锁定它,那么代码片段应该如下所示,在这种情况下,任何拥有类锁的线程只能在没有对象锁时同时访问该方法通过任何其他线程。

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

2.如果我使用Class instance lock 来锁定instanceMethod 方法,那么任何拥有Object lock 的线程都可以同时访问该方法吗? 这取决于是否有任何线程在 Class 实例上放置了锁,然后线程拥有的 Object 锁不能访问它,否则它可以。

  相关解决方案