关于侦听器的向量Java并发问题
关于Java,什么是并发的最佳解决方案或通用解决方案?我在这个网站和其他网站上看到了很多解决方案,但没有一个能解决我的问题
我的问题如下:我有一个{ArrayList
或类似的东西)
现在,我定期(每秒数千次)读取这个vector
中的所有元素,并以某种方式对它们进行操作。同时,我根据myMouseListener
和myKeyListener
中的事件添加和删除元素(这对于程序来说是必不可少的)。这当然给我带来不少问题。我不想在添加或删除元素时读取vector
,因为这样会抛出java.util.ConcurrentModificationException
。但是,我不能真正使用一个临时的vector
来存储这些事件,因为这会造成在向它添加内容时清除这个vector
的问题。你如何摆脱这一困境
# 1 楼答案
您可以使用java使用线程安全包装器包装项目向量。util。收藏。列表有一种特定的方法,即synchronizedList,但不适用于Vector。这仅通过同步所有公共方法调用、add()和remove()等来解决部分问题
(或用于列表)
您还需要保护您的迭代。。。有两种方法可以做到这一点,或者在迭代时锁定集合
或者复制一份,然后重复一遍
# 2 楼答案
您想使用^{} 。这在多线程和并发编程环境中使用是安全的
在
CopyOnWriteArrayList
上迭代时,不会得到ConcurrentModificationException
,因为任何更改都会在内部创建一个新数组,并且不会影响正在迭代的数组。它的设计基本上是为了容纳一系列听众这有迭代时不需要任何同步的好处,并且有非常短的锁定段,迭代将永远不会阻塞