嗯,
想象一下:
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
对象的同步块(synchronized block)下进行的。当回调onSuccess
被调用时,dataStorage
仍然处于同步方案下?
2) onError
方法启动一个内部线程。 dataStorage
仍处于同步方案下吗?
最佳答案
如果您的webRequest.execute()
没有立即完成,而是阻塞直到调用onSuccess/onError
,那么这些方法将在同一个synchronized
block ,但它也会破坏这种迂回的、基于回调的 API 的全部目的,其主要目的是允许异步。
因此,在 dataStorage
上持有锁时,您的方法要么不会被调用,要么它们会被调用,但您使用了错误类型的 API 来实现这一点。
关于java - 同步和线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26962244/