我的程序中有两个线程和一个 ArrayList。我想从我的线程访问列表。
public void run() {
...
arraylist.add(myObj);
...
}
public void run() {
...
arraylist.remove(myObj);
...
}
我尝试了同步每个线程。
synchronized (arraylist)
{
//add or remove
}
但它说“非最终字段的同步”。
我的程序中有两个线程和一个 ArrayList。我想从我的线程访问列表。
public void run() {
...
arraylist.add(myObj);
...
}
public void run() {
...
arraylist.remove(myObj);
...
}
我尝试了同步每个线程。
synchronized (arraylist)
{
//add or remove
}
但它说“非最终字段的同步”。
非最终字段 的同步只是 您可以放心忽略的警告。如果arraylist
仅在构造函数中分配,则可以将其声明为final
并摆脱警告。
您需要在列表上进行同步,因为该remove
方法本质上不是线程安全的(一个线程可能会在搜索要删除的元素时修改列表)。 remove
似乎还有其他操作arraylist
没有同步。
Synchronization of non-final field
当有多个线程正确同步代码块时,编译器会发出此警告,它们需要在同一对象实例上同步。