Android游戏中的线程帮助

3
我需要一些关于在Android中处理三个线程的帮助。
一个线程是主线程,另一个是GLThread,还有一个是我创建的WorkerThread,用于更新游戏状态。
我的问题是它们都需要访问相同的游戏对象LinkedList。GLThread和WorkerThread仅从LinkedList中读取,因此没有问题,但偶尔主线程会添加另一个游戏对象到列表中。
我该如何管理这个问题?我尝试在涉及的函数前使用synchronized,但它会使应用程序变得非常缓慢。
由于某种原因,只捕获错误而不呈现或更新游戏状态,会导致它永久性地开始滞后。
是否有任何好的想法?
2个回答

1
我建议使用CopyOnWriteArrayList。它在修改时会复制后备列表,但允许未同步的读取,这意味着您正在从写入方面的瞬间读取列表。

0

有多种方法可以实现:如果你的列表不太大,那么可以对列表进行CAS(比较并设置),这是一个原子操作。这需要你创建一个列表的副本,在其中添加需要添加的项,然后在不加锁的情况下进行CAS。如果添加只是偶尔发生的话,那么它不会成为一个重要的开销。CAS是Java中原子库AtomicReference 上的一种方法......正如软件猴子所提到的,同样的事情也可以通过 CopyOnWriteArrayList 实现。

或者,你也可以看一下Java的并发库中的各种容器,或者如果你想要一个无锁集合,那就使用ConcurrentHashMap


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接