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