Java 多线程中的同步ArrayList编辑

Java 多线程中的同步ArrayList编辑,java,multithreading,arraylist,Java,Multithreading,Arraylist,我有多个同类线程共享ArrayList: static ArrayList<Integer> Terminate_List = new ArrayList<Integer>(); 另一个线程已经删除了列表中的另一项,大小已经减小,我得到一个IndexOutOfBoundsException。所以我的计划是使这个方法同步,这样一次只有一个线程可以执行这个方法。该方法由计时器执行。我怎么能一次只让一个线程执行这个方法呢 public synchronized voi

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

static ArrayList<Integer> Terminate_List = new ArrayList<Integer>();
另一个线程已经删除了列表中的另一项,大小已经减小,我得到一个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); }}}
public synchronized void update_list(){
对于(int k=0;k
不要使用-使用。这样,您根本不必担心索引

另外,
Terminate\u List
是静态的,而您的方法不是静态的。这意味着,如果类有多个实例,那么阻塞只会发生在两个线程访问同一实例的情况下。要阻止其他线程更新
Terminate_List
,您需要更新使用synchronized的方式

您的代码将变成:

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

注意-我假设
这个ID
被定义为
int
-如果它已经是一个
整数
,那么您就不需要强制转换(并且您在原始代码中的等式检查会有问题)。

这可能是因为您有多个类的实例
更新列表()
位于中,是一个静态列表,供所有人使用。如果为真,则需要使用列表作为监视器进行同步:

public void update_list() {
  synchronized (terminateList) {
      // ...
  }
}

使用静态变量并将update_list()放入循环中。如果静态变量布尔值为true,则将其签出(如果为false),然后进行更新。您应该针对同一对象同步列表的所有更新。我们无法判断是否是这种情况,因为我们不知道
update\u list()
在哪里。@brso05很抱歉,这是一个可怕的想法。它是错误的,但它的失败不会立即显现出来,因为它大部分时间都会工作。@Hydrophilia可能的原因是无论哪个类
update\u list()
,都有多个实例。如果看不到更多的代码,就不可能确定。或者更好:使用支持并发的适当集合。对于
列表
,您有。但在我看来,最好使用另一种方法来解决您的问题,比如
ConcurrentHashMap
。由于列表包含
整数
s,并且
此ID
可能是
整数
,因此需要在此处进行显式转换。问题中没有提到
此ID
是什么;虽然基于OP使用
=
进行比较而不是
等于
,但您可能是对的。我会更新答案。
public void update_list() {
  synchronized (terminateList) {
      // ...
  }
}