8

我正在开发一个 android 游戏,我刚刚注意到,由于onTouchEvent在 UI 线程上运行,并且更新/渲染方法是从单独的线程运行的,它们都更新了ArrayList包含实体的一个。因此,如果他们碰巧同时修改列表,显然它们会发生冲突。

我读到该类的使用与同步的唯一区别Vector完全相同,因此它们不会发生冲突。真的吗?如果是这样,它是否有任何性能问题或我应该关注的事情?我以前从未使用过类。ArrayListVectorVector

编辑:我真正的意思是改变

ArrayList<Obj> list = new ArrayList<Obj>();

Vector<Obj> list = new Vector<Obj>()

但正如答案所说,Vector不建议使用。选定的答案解决了我的问题。

4

4 回答 4

36

对于那些必须与遗留代码作斗争的人,请执行以下操作:

new Vector<Obj>(anyThingWhichImplemntsCollection);
于 2014-04-04T09:43:22.207 回答
9

这是老歌Vector尝试不使用 Vector 而是使用

synchronizedList

例子 :

list = Collections.synchronizedList(list);

Vector 被认为已过时并已弃用阅读为什么 vector is Considerer 已过时?

于 2013-07-04T21:53:18.293 回答
2
List<Foo> list = new Vector<Foo>(new ArrayList<Foo>());  

应该管用。这两个结构都实现了 List 接口。

但就像其他人建议的那样,不推荐这样做。

于 2013-07-04T21:53:30.770 回答
0

正如 nachokk 已经提到的那样,synchonizedList会成功的。 synchronizedList将在您的列表周围返回一个包装器,因此不会进行复制。
缺点是一次只能调用一次列表。列表中的两次读取将是连续的,即使它们可以并行完成。同步块总是意味着一点点开销,如果经常调用会降低性能。

另一种选择是使用并发列表。这首先意味着一个副本,但访问性能可以显着提高。如果您有很多阅读请求(例如绘画),aCopyOnWriteArrayList将是一个不错的选择。读取速度几乎与普通 ArrayList 一样快,并且不会被阻塞。对列表的写入将是连续且昂贵的,因为它们必须复制整个数组。
CoWArrayList 的另一个优点是您可以在不捕获 ConcurrentModificationException 的情况下进行迭代。由返回的迭代器iterator()将始终使用相同的后备数组,即使列表已更改。

于 2013-07-05T09:11:19.893 回答