java - 同步和线程

标签 java android multithreading synchronization

嗯,

想象一下:

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/

相关文章:

java - 在 Java 中将 long[64] 转换为 byte[512]?

c# - 处理并发

c++ - C++11 中的双重检查锁单例

c++ - 使用Qt5 SQL进行异步数据库访问的策略

java - 自动将变量写入子类

java - 如何在其他类中使用变量

java - Jboss服务器启动异常

java - 如何使用 ExoPlayer 播放 DES 加密文件

java - 使用 Hibernate @NaturalId 查找实体有什么好处

android - 以下类无法实例化 : – com. facebook.widget.LoginButton