我正在开发一款Android游戏,我注意到,因为onTouchEvent
在UI线程上运行,而更新/渲染方法是从一个单独的线程运行的,所以它们都更新{{1}其中包含实体。显然,如果他们碰巧同时修改了列表,他们会发生冲突。
我读到ArrayList
类与Vector
完全相同,唯一的区别是ArrayList
已同步,因此它们不会发生冲突。真的吗?如果是的话,它是否有任何性能问题或我应该关注的事情?我之前从未使用过Vector
课程。
编辑: 我实际上的意思是改变
Vector
到
ArrayList<Obj> list = new ArrayList<Obj>();
但正如答案所说,不建议使用Vector<Obj> list = new Vector<Obj>()
。选定的答案解决了我的问题。
答案 0 :(得分:28)
对于那些必须与遗留代码作斗争的人,请执行以下操作:
new Vector<Obj>(anyThingWhichImplemntsCollection);
答案 1 :(得分:9)
这是老人Vector
尝试不使用Vector而是使用
示例:
list = Collections.synchronizedList(list);
Vector被认为已过时且已弃用,请阅读Why vector is considerer obsolete?
答案 2 :(得分:1)
List<Foo> list = new Vector<Foo>(new ArrayList<Foo>());
应该有效。这两个结构都实现了List接口。
但正如其他人所说,这不是建议。
答案 3 :(得分:0)
正如nachokk已经提到的那样,synchonizedList
将会成功。
synchronizedList
将在您的列表周围返回一个包装器,因此不会进行复制
缺点是一次只能对列表进行一次调用。列表中的两个读取将是顺序的,即使它们可以并行完成。如果经常调用,同步块总是意味着一点开销并且会降低性能。
另一种选择是使用并发列表。这意味着首先是副本,但可以显着提高访问性能。
如果您有许多阅读请求(例如绘画),CopyOnWriteArrayList
将是一个不错的选择。读取几乎与普通ArrayList一样快,不会被阻止。写入列表将是顺序且昂贵的,因为它们必须复制整个数组
CoWArrayList的另一个好处是,您可以在不捕获ConcurrentModificationException的情况下进行迭代。即使列表已更改,iterator()
返回的迭代器也将始终使用相同的后备数组。