那么,
想象一下:
synchronized (dataStorage) {
dataStorage.add(hashMap);
submitDataToServer();
}
此处,方法submitDataToServer()
private synchronized void submitDataToServer()
{
if(dataStorage.size() > 0)
{
final HashMap<String, Object> hashMap = dataStorage.peek();
HttpWebRequest webRequest = new HttpWebRequest(context, ServicesName.getTravelServiceFullUrl(), false, hashMap)
{
@Override
public void onSuccess(String result)
{
dataStorage.remove(hashMap);
if(dataStorage.size() > 0)
submitDataToServer();
}
@Override
public void onError(String result)
{
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
submitDataToServer();
}
}, tryAgainDelay);
}
};
webRequest.execute();
}
}
我的问题是关于同步化:
1)对submitDataToServer()
的调用是在传递dataStorage
对象的同步块下。当调用回调onSuccess
时,dataStorage
仍处于同步方案下?
2)onError
方法启动内部线程。 dataStorage
仍然会处于同步方案中吗?
答案 0 :(得分:2)
如果您的webRequest.execute()
没有立即完成,而是阻止,直到它有时间调用onSuccess/onError
,那么这些方法将在同一个synchronized
块中调用,但是它也将破坏拥有如此迂回的基于回调的API的全部目的,其主要目的是允许异步。
因此,在dataStorage
上持有锁时,不会调用您的方法,否则它们会使用错误的API来实现。