Android游戏的线程帮助

时间:2010-03-13 21:22:59

标签: java android multithreading thread-safety

我需要一些帮助处理Android中的三个主题

一个线程是主线程,另一个是GLThread,另一个是我为更新游戏状态而创建的WorkerThread。

我遇到的问题是他们都需要访问游戏对象的相同LinkedList。 GLThread和我的WorkerThread都只从LinkedList读取,所以没有问题,但偶尔我有主线程将另一个游戏对象添加到列表中。

我该如何管理?我尝试在所涉及的函数前面使用synchronized,但它确实会降低应用程序的速度。

出于某种原因,只是捕捉错误而不是渲染或更新游戏状态,导致它永久地开始滞后。

任何人都有什么好主意吗?

2 个答案:

答案 0 :(得分:1)

我建议使用CopyOnWriteArrayList。这会在备份列表发生变异时复制备份列表,但允许不同步的读取,以及从写入时刻读取列表的权衡。

答案 1 :(得分:0)

有多种方法可以做到这一点:如果您的列表不是太大,那么您可以CAS(比较和设置)列表,这是一个原子操作。这要求您创建列表的副本,添加需要添加的项目,然后添加CAS而不锁定。如果它只是偶尔发生添加,那么它不会是一个重大的开销。 CAS是来自Java AtomicReferenceatomic library的方法......正如Software Monkey所提到的,CopyOnWriteArrayList可以实现同样的目的。

或者,您也可以查看Java concurrency library中的各种容器,或者如果您想拥有无锁集合,请使用ConcurrentHashMap