-2

我的程序中有两个线程和一个 ArrayList。我想从我的线程访问列表。

public void run() {
...
arraylist.add(myObj);
...
}

public void run() {
...
arraylist.remove(myObj);
...
}

我尝试了同步每个线程。

 synchronized (arraylist) 
 {  
    //add or remove
 } 

但它说“非最终字段的同步”。

4

2 回答 2

1

非最终字段 的同步只是 您可以放心忽略的警告。如果arraylist仅在构造函数中分配,则可以将其声明为final并摆脱警告。

您需要在列表上进行同步,因为该remove方法本质上不是线程安全的(一个线程可能会在搜索要删除的元素时修改列表)。 remove

于 2013-03-18T13:45:18.420 回答
0

似乎还有其他操作arraylist没有同步。

Synchronization of non-final field当有多个线程正确同步代码块时,编译器会发出此警告,它们需要在同一对象实例上同步。

于 2013-03-18T13:43:21.010 回答