为什么此SynchronizedList线程包装器是安全的?

时间:2019-11-07 21:25:09

标签: java concurrency

我正在阅读“ Java并发实践”,这种情况对我来说还不太清楚。为什么使用这段代码ThreadSafe?

@ThreadSafe
public class ListHelper<E> {
    public List<E> list =
        Collections.synchronizedList(new ArrayList<E>());
    ...
    public boolean putIfAbsent(E x) {
        synchronized (list)  {
            boolean absent = !list.contains(x);
            if (absent)
} }
}

我们锁定SynchronizedList列表的实例,但在使用内部对象的列表中 final Object mutex; // Object on which to synchronize

  public void add(int index, E element) {
            synchronized (mutex) {list.add(index, element);}
        }

我们仍然在两个不同的对象上具有锁。为什么安全?

1 个答案:

答案 0 :(得分:6)

好问题。 您必须遵循分配互斥锁的整个过程。

如果在调用Collections.synchronizedList作为第二个参数时未明确指定,则 将是列表本身。

深入了解您最终发现了这一点:

mutex = this;