【问题标题】:Java lock on static and non static method?Java锁定静态和非静态方法?
【发布时间】:2019-07-06 20:06:11
【问题描述】:

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

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

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

class Test {

          public static synchronized void staticMethod(){
          }

          public synchronized void instanceMethod(){
          }
}

谢谢

【问题讨论】:

标签: java multithreading locking


【解决方案1】:

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

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方法,那么任何拥有类锁的线程都可以同时访问该方法吗?
首先你不应该用对象锁锁定静态方法,但是如果你想用对象锁锁定它,那么代码 sn-p 应该如下所示,在这种情况下,任何拥有类锁的线程只能在对象锁被锁定时同时访问该方法未被任何其他线程占用。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-27
    • 2011-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-07
    相关资源
    最近更新 更多