为什么锁错了?

时间:2016-12-15 12:34:09

标签: java multithreading locking

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;
  }
}

我无法理解为什么这不起作用。

如果我将列表更改为私有字段,那么此代码是否正确?

1 个答案:

答案 0 :(得分:1)

代码不起作用(即无法可靠地同步访问),因为其他代码可以直接访问list,从而绕过synchronized锁。

将其设为private会阻止它。

你使用synchronizedList的事实没有帮助(如果涉及的同步锁将与你的方法使用的同步锁相同,但它不会)。

如果您希望公开list,则可以更新您的方法以在同一个锁上进行同步(即list本身)。

这种方法是detailed in the JavaDoc for synchronizedList