java - 多线程同步 ArrayList 编辑

标签 java multithreading arraylist

我有多个共享 ArrayList 的同类线程:

static ArrayList<Integer> Terminate_List = new ArrayList<Integer>();

此 ArrayList 需要更新。我需要删除该列表中的单个项目。问题是当我到达终点线时

Terminate_List.remove(k);

另一个线程已经删除了列表中的另一个项目,大小已减小,并且我收到 IndexOutOfBoundsException。所以我的计划是使这个方法同步,这样一次只有一个线程可以执行这个方法。该方法由定时器执行。我怎样才能真正一次只让一个线程执行这个方法?

    public synchronized void update_list(){

   for (int k = 0; k < Terminate_List.size(); k++) {

        if (Terminate_List.get(k) == this_ID){

            Terminate_List.remove(k); }}}

最佳答案

不要使用remove by index - 使用remove by reference 。这样您就根本不必担心索引。

此外,Terminate_List 是静态的,而您的方法不是。这意味着如果您的类有多个实例,则仅当两个线程访问同一实例时才会发生阻塞。要阻止其他线程更新 Terminate_List,您需要更新使用同步的方式。

你的代码将变成这样:

public void update_list(){
   // your previous impl was equivalent to synchronized(this)
   synchronized (Terminate_List) {  
       Terminate_List.remove((Integer)this_ID);
   }
}

注意 - 我假设 this_ID 被定义为 int - 如果它已经是 Integer 那么你不需要强制转换(并且您的原始代码中的相等性检查会出现问题)。

关于java - 多线程同步 ArrayList 编辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26391428/

相关文章:

android - ListView 仅显示 ArrayList(HashMap) 的最后一个元素

java - Android 和 ArrayLIst Size 返回 0

java - LibGDX BitmapFont 不会停止摇晃

java - 如何清除android中的手势?

java - 使用线程安全对 concurrentHashMap 进行排序

java - 通过名称调用服务时,服务因空指针而失败,而在调用休息时则正常工作

java - 如何从 Java 中的 ArrayList 中删除特定对象?

java - 在命令行运行器构造函数下显示 springboot 应用程序中的一组元素

java - 定义的 TextView 上出现 NullPointerException

java - 多线程java应用程序的设计模式