我有多个共享 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/