我试图理解如果我将方法标记为已同步以及该方法内的调用会发生什么情况会发生什么。我的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个方法?
答案 0 :(得分:3)
更确切地说,syncMethod
将锁定实例(SyncClass
)。如果将synchronized
方法或块应用于同一实例,则会阻止它。在您的情况下,Service
和serviceBlock
与SyncClass
无关,所以不会,它不会阻止。
答案 1 :(得分:1)
答案是否定的。 只能为syncMethod()
获取锁定答案 2 :(得分:0)
此处的关键字synchronized
表示对syncMethod
的调用将被序列化(一次一个线程)。
您在syncMethod
内创建的对象不会自动保护。因此,如果将这些对象暴露给外部代码,那么它们可以同时进行变异。
与此同时,在{strong>您的示例service
对象在syncMethod
之外不可见。在save
之外,serviceBlock
对象不可见。因此,无法从外部调用methodA
。在这种情况下,不需要进一步同步。