【问题标题】:Why the lock wrong? [duplicate]为什么锁错了? [复制]
【发布时间】:2017-05-01 01:32:59
【问题描述】:
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;
  }
}

我不明白为什么这不起作用。

如果我将列表更改为私有字段,这段代码不正确吗?

【问题讨论】:

  • 我不知道你想在那里实现什么以及为什么什么都不起作用,但看起来你正在模仿 Set 并且可能想在 List 上使用它。

标签: java multithreading locking


【解决方案1】:

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

将其设为private 可以防止这种情况发生。

您使用synchronizedList这一事实并没有帮助(如果其中涉及的同步锁与您的方法使用的同步锁相同,但事实并非如此)。

如果您想保持list 公开,您可以更新您的方法以在同一个锁上同步(即list 本身)。

这种方法是detailed in the JavaDoc for synchronizedList

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-14
    • 1970-01-01
    相关资源
    最近更新 更多