use*_*844 2 java android thread-safety
我是Java的新手,在尝试实现一个简单的游戏时遇到了一个问题.目前游戏的前提是,计时器用于添加汽车,并且还更频繁地更新汽车的运动.可以通过触摸选择汽车,并通过绘制它的路径来指示.更新功能将沿着路径移动汽车.
现在,游戏因IndexOutOfBoundsException而崩溃,我几乎可以肯定这是因为偶尔重新选择汽车时,会擦除当前路径,并允许绘制新路径.该路径存储为LinkedList,并在触摸汽车时清除.
我想如果路径是通过触摸事件清除的,而计时器线程正在更新汽车沿路径的移动,这就是错误发生的地方(两个线程访问这一个列表时也可能出现类似的其他问题.
我的问题,在Java中,处理这个问题的最佳方法是什么?是否存在我应该使用的特定类型的列表而不是LinkedList,或者是否存在c ++中的Mutex等对象,我可以在使用它时保护此列表?
在Java中,这通常使用同步来完成
一个小例子看起来像这样:
LinkedList list = //Get/build your list
public void doStuffToList()
{
synchronized(list)
{
//Do things to the list
}
}
public void clearList()
{
synchronized(list)
{
list.clear();
}
}
Run Code Online (Sandbox Code Playgroud)
如果此时列表中当前正在运行另一个线程,则此代码不会执行清除操作.请注意,这将导致阻塞,因此请注意死锁.
或者,如果您List是自己构建的类,那么使数据结构线程本身安全可能是有意义的:
public class SynchroLinkedList
{
//Implementation details
public synchronized void doThingsToList()
{
//Implementation
}
public synchronized void clearList()
{
//Implementation
}
}
Run Code Online (Sandbox Code Playgroud)
这两种方法可以有效地以相同的方式工作,但是第二种方法将线程安全性抽象为数据类型,这很好,因为当您使用列表时,您不必担心线程安全.
| 归档时间: |
|
| 查看次数: |
203 次 |
| 最近记录: |