public class ListHelper<E> {
public List<E> list =
Collections.synchronizedList(new ArrayList<E>());
...
public synchronized boolean putIfAbsent(E x) {
boolean absent = !list.contains(x);
if (absent)
list.add(x);
return absent;
}
}
我无法理解为什么这不起作用。
如果我将列表更改为私有字段,那么此代码是否正确?
答案 0 :(得分:1)
代码不起作用(即无法可靠地同步访问),因为其他代码可以直接访问list
,从而绕过synchronized
锁。
将其设为private
会阻止它。
你使用synchronizedList
的事实没有帮助(如果涉及的同步锁将与你的方法使用的同步锁相同,但它不会)。
如果您希望公开list
,则可以更新您的方法以在同一个锁上进行同步(即list
本身)。