请问同步方法会锁定其中的所有方法吗?

时间:2018-01-29 13:38:21

标签: java multithreading

我试图理解如果我将方法标记为已同步以及该方法内的调用会发生什么情况会发生什么。我的SyncClass是从外部Web服务调用的。这些Web服务调用可以发生任意次。 例如:

//Webservice talks to this class.
class SyncClass {
    public synchronized void syncMethod() {
        Service service = new Service();
        service.serviceBlock();
      }
}

class Service{

   public void serviceBlock(){
    doManyThings(){
    // validation
    // service logic
    SaveService save = new SaveService();
    save.saveMe();
   }
}

}

class SaveService {

 public void saveMe(){
  //many operations
  public methodA();
  public methodB();
  public methodC();
}
}

如果来自我的应用程序的调用直接调用methodA(),methodB(),methodC()等,会发生什么。这些方法可以从其他地方调用。如果syncMethod从webservice获得了锁定,它是否也会锁定这3个方法?

3 个答案:

答案 0 :(得分:3)

更确切地说,syncMethod将锁定实例(SyncClass)。如果将synchronized方法或块应用于同一实例,则会阻止它。在您的情况下,ServiceserviceBlockSyncClass无关,所以不会,它不会阻止。

答案 1 :(得分:1)

答案是否定的。 只能为syncMethod()

获取锁定

答案 2 :(得分:0)

此处的关键字synchronized表示对syncMethod的调用将被序列化(一次一个线程)。

您在syncMethod内创建的对象不会自动保护。因此,如果将这些对象暴露给外部代码,那么它们可以同时进行变异。

与此同时,在{strong>您的示例service对象在syncMethod之外不可见。在save之外,serviceBlock对象不可见。因此,无法从外部调用methodA。在这种情况下,不需要进一步同步。