【问题标题】:Addition or removal to SynchronizedMap, and synchronized blocks添加或删除 SynchronizedMap 和同步块
【发布时间】:2018-09-16 23:29:55
【问题描述】:

我正在使用 AWS Android SDK 将图像文件上传到 S3 存储桶。我在裁剪完成后开始传输图像文件的线程中进行裁剪操作。我将所有 TransferObserver 实例保存在如下定义和初始化的 Map 中:

private Map<String, TransferObserver> transferObservers;

A() {
    transferObservers = Collections.synchronizedMap(new LinkedHashMap<String, TransferObserver>());
}

public void add(Image image) {
    handler.post(new Runnable() {
        @Override
        public void run() {
            // Cropping
            ...
            TransferObserver uploadObserver = transferUtility.upload(key, new File(localFilePath));
            uploadObserver.setTransferListener(new TransferListener() {
            photoTransferObservers.put(image.getPath(), uploadObserver);
        }
    }
}

图像可以被删除,因此它在地图中的条目:

public void deleteTransferRecord(String key) {
    transferObservers.remove(key);
}

还有一个函数可以返回上传的整个过程:

private void notifyListeners() {
    int completedUploadCount = 0;
    for (TransferObserver transferObserver : transferObservers.values()) {
        if (transferObserver.getState() == TransferState.COMPLETED) {
            completedUploadCount++;
        }
    }
    ...
}

我在transferObservers 的迭代过程中遇到了一个关于删除尝试的异常——我没有注意到它。我应该如何更新我的代码以防止任何并发问题?

【问题讨论】:

    标签: java android collections aws-sdk


    【解决方案1】:

    无论您在何处访问它(无论是添加、删除还是读取),您都可以通过 transferObservers 进行同步。那时你不需要Collections.synchronizedMap

    或者,更简单的解决方案可能是在迭代 notifyListeners 之前简单地复制值。这样在迭代时移除或添加到传输观察者不会导致ConcurrentModificationException

    private void notifyListeners() {
        int completedUploadCount = 0;
        List<TransferObserver> observers = new ArrayList<>(transferObservers.values());
        for (TransferObserver transferObserver : observers) {
            if (transferObserver.getState() == TransferState.COMPLETED) {
                completedUploadCount++;
            }
        }
        ...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-29
      • 2023-02-16
      • 2014-05-05
      • 2019-04-19
      • 1970-01-01
      • 1970-01-01
      • 2011-10-20
      • 1970-01-01
      相关资源
      最近更新 更多