有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

关于侦听器的向量Java并发问题

关于Java,什么是并发的最佳解决方案或通用解决方案?我在这个网站和其他网站上看到了很多解决方案,但没有一个能解决我的问题

我的问题如下:我有一个{}的{}我自己写的。(如果这有助于解决问题,我可以很容易地将其变成ArrayList或类似的东西) 现在,我定期(每秒数千次)读取这个vector中的所有元素,并以某种方式对它们进行操作。同时,我根据myMouseListener和myKeyListener中的事件添加和删除元素(这对于程序来说是必不可少的)。这当然给我带来不少问题。我不想在添加或删除元素时读取vector,因为这样会抛出java.util.ConcurrentModificationException。但是,我不能真正使用一个临时的vector来存储这些事件,因为这会造成在向它添加内容时清除这个vector的问题。你如何摆脱这一困境


共 (2) 个答案

  1. # 1 楼答案

    您可以使用java使用线程安全包装器包装项目向量。util。收藏。列表有一种特定的方法,即synchronizedList,但不适用于Vector。这仅通过同步所有公共方法调用、add()和remove()等来解决部分问题

    private Collection<Thing> things =
             Collections.synchronizedCollection(new Vector<Thing>());
    

    (或用于列表)

    private Collection<Thing> listeners =
           Collections.synchronizedList(new ArrayList<Thing>());
    

    您还需要保护您的迭代。。。有两种方法可以做到这一点,或者在迭代时锁定集合

    synchronized (things) {
        for (Thing thing : things) {
    
        }
    }
    

    或者复制一份,然后重复一遍

    for (Thing thing : things.toArray(new MouseListener[]{})) {
    
    }
    
  2. # 2 楼答案

    您想使用^{}。这在多线程和并发编程环境中使用是安全的

    CopyOnWriteArrayList上迭代时,不会得到ConcurrentModificationException,因为任何更改都会在内部创建一个新数组,并且不会影响正在迭代的数组。它的设计基本上是为了容纳一系列听众

    这有迭代时不需要任何同步的好处,并且有非常短的锁定段,迭代将永远不会阻塞