同步和线程

时间:2014-11-16 21:28:15

标签: 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对象的同步块下。当调用回调onSuccess时,dataStorage仍处于同步方案下?

2)onError方法启动内部线程。 dataStorage仍然会处于同步方案中吗?

1 个答案:

答案 0 :(得分:2)

如果您的webRequest.execute()没有立即完成,而是阻止,直到它有时间调用onSuccess/onError,那么这些方法将在同一个synchronized块中调用,但是它也将破坏拥有如此迂回的基于回调的API的全部目的,其主要目的是允许异步。

因此,在dataStorage上持有锁时,不会调用您的方法,否则它们会使用错误的API来实现。