Java Listview数据中的并发ModificationException

Java Listview数据中的并发ModificationException,java,android,listview,Java,Android,Listview,每次修改后,我都会对列表数据进行排序,但由于有几个线程可以调用排序方法块,因此我决定将其放入同步的块中。我的代码如下所示。问题是,删除synchronized块,我仍然在Collections.sort(storageBckupData.get(msg.what.getTotalItems(),new backupdateacomparator())行上获得“ConcurrentModificationExceptio”。我为什么老是收到这个 class IncomingHandler ext

每次修改后,我都会对列表数据进行排序,但由于有几个线程可以调用排序方法块,因此我决定将其放入
同步的
块中。我的代码如下所示。问题是,删除
synchronized
块,我仍然在
Collections.sort(storageBckupData.get(msg.what.getTotalItems(),new backupdateacomparator())行上获得“ConcurrentModificationExceptio”。我为什么老是收到这个

 class IncomingHandler extends Handler {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                default:
                    synchronized(LOCK) {
                        while(inUse) {
                            try {
                                LOCK.wait();
                            } catch (InterruptedException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                        }
                        inUse = true;

                        Collections.sort(storageBckupData.get(msg.what).getTotalItems(),new BackupDataComparator());

                        inUse = false;
                        LOCK.notifyAll();
                    }
                    notifyDataSetChanged();
                    super.handleMessage(msg);
            }
        }
    }
不是关于是否已同步,而是当集合检测到修改与不允许同步的内容同时进行时。例如,您可能有一个迭代器(在代码中没有显示的其他地方)遍历项目列表。这与保护收藏的完整性有关

另一个线程中发生了什么?它是不是在同时浏览列表? 画两条线的一条线,你应该清楚地发现一条线和另一条线并行在做什么

还有,你真的需要锁吗?您可以通过以下方法获得同步集合:


为什么不使用适当的数据结构来更有效地进行排序?如果每个项目都是唯一的,您可以使用一个实现,例如。

谢谢。这真的很有帮助。为什么我会想到
TreeSet
Collections.synchronizedList()
;谢谢。