Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我需要一个线程安全的数据结构。我应该用什么?_Java_Android_Multithreading_Concurrency_Thread Safety - Fatal编程技术网

Java 我需要一个线程安全的数据结构。我应该用什么?

Java 我需要一个线程安全的数据结构。我应该用什么?,java,android,multithreading,concurrency,thread-safety,Java,Android,Multithreading,Concurrency,Thread Safety,当我使用Reformation向服务器发送异步调用时,我将此调用放入列表中 因此,当调用的状态发生变化时(来自服务器的响应或用户取消的响应,…),我会在列表中添加/删除调用 当进行调用且列表中不存在以前的调用时,将显示进度对话框。当列表中的最后一个调用被删除时,它将取消对话框 那么在这种情况下,哪种数据结构将是最佳选择?我看过一些关于java.util.concurrent包的帖子。我确信CopyOnWriteArrayList不是一个好的选择,因为我需要如此频繁地添加/删除数据,但还有什么其他

当我使用Reformation向服务器发送异步调用时,我将此调用放入列表中

因此,当调用的状态发生变化时(来自服务器的响应或用户取消的响应,…),我会在列表中添加/删除调用

当进行调用且列表中不存在以前的调用时,将显示进度对话框。当列表中的最后一个调用被删除时,它将取消对话框


那么在这种情况下,哪种数据结构将是最佳选择?我看过一些关于java.util.concurrent包的帖子。我确信CopyOnWriteArrayList不是一个好的选择,因为我需要如此频繁地添加/删除数据,但还有什么其他的。。当前我正在使用LinkedBlockingQueue。

可能尝试Collections.newSetFromMap(new ConcurrentHashMap()),因为它为您提供了接近O(1)的添加和删除功能。

您不仅需要同步数据结构,还需要同步进度对话框实例访问。您可以这样同步:

private Object lock = new Object();
private Set<Call> calls = new HashSet<>();
private ProgressDialog progressDialog;

void addCall(Call call) {
    synchronized(lock) {
        calls.add(call);
        if (calls.size() == 1) {
            progressDialog.show();
        }
    }
}

void removeCall(Call call) {
    synchronized(lock) {
        calls.remove(call);
        if (calls.size() == 0) {
            progressDialog.hide();
        }
    }
}
private Object lock=new Object();
私有集调用=新HashSet();
私有进程对话;
void addCall(调用调用){
已同步(锁定){
调用。添加(调用);
if(调用.size()==1){
progressDialog.show();
}
}
}
void removeCall(调用){
已同步(锁定){
调用。删除(调用);
if(调用.size()==0){
progressDialog.hide();
}
}
}
有关同步的更多信息

说到性能,这种锁定应该不是问题。如果遇到性能问题,则需要进行调查,找出瓶颈并进行相应的修改。请记住,每个线程安全的数据结构都有自己的开销和权衡。是一个完美的例子;对突变的处理效率极低,但如果您主要执行遍历,则非常完美