gpt4 book ai didi

java - 同步和线程

转载 作者:行者123 更新时间:2023-12-02 05:15:47 26 4
gpt4 key购买 nike

嗯,

想象一下:

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com