两个线程访问相同的LinkedList

use*_*844 2 java android thread-safety

我是Java的新手,在尝试实现一个简单的游戏时遇到了一个问题.目前游戏的前提是,计时器用于添加汽车,并且还更频繁地更新汽车的运动.可以通过触摸选择汽车,并通过绘制它的路径来指示.更新功能将沿着路径移动汽车.

现在,游戏因IndexOutOfBoundsException而崩溃,我几乎可以肯定这是因为偶尔重新选择汽车时,会擦除当前路径,并允许绘制新路径.该路径存储为LinkedList,并在触摸汽车时清除.

我想如果路径是通过触摸事件清除的,而计时器线程正在更新汽车沿路径的移动,这就是错误发生的地方(两个线程访问这一个列表时也可能出现类似的其他问题.

我的问题,在Java中,处理这个问题的最佳方法是什么?是否存在我应该使用的特定类型的列表而不是LinkedList,或者是否存在c ++中的Mutex等对象,我可以在使用它时保护此列表?

Jor*_*aye 8

在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)

这两种方法可以有效地以相同的方式工作,但是第二种方法将线程安全性抽象为数据类型,这很好,因为当您使用列表时,您不必担心线程安全.