为什么要同步同步列表?

why synchronize a synchronized list?

如果我创建这样一个列表:

List<MyObj> myobjs = Collections.synchronizedList(new ArrayList<MyObj>()); 

相关文档声称此返回列表需要同步才能遍历元素。然而,我可以同步一个常规列表并用同步块保护它。那么,为什么我需要 "synchronizedList"?

Returns a synchronized (thread-safe) list backed by the specified list. In order to guarantee serial access, it is critical that all access to the backing list is accomplished through the returned list.

It is imperative that the user manually synchronize on the returned list when iterating over it:

  List list = Collections.synchronizedList(new ArrayList());
      ...
  synchronized (list) {
      Iterator i = list.iterator(); // Must be in synchronized block
      while (i.hasNext())
          foo(i.next());
  }

Failure to follow this advice may result in non-deterministic behavior. The returned list will be serializable if the specified list is serializable.

Parameters: list the list to be "wrapped" in a synchronized list. Returns: a synchronized view of the specified list.

synchronizedList 是一个方便的包装器,它允许您在大多数情况下避免手动同步,但在迭代它时则不然。

对于普通的非同步列表,如果它被多个线程使用,则需要始终手动同步,因此使用synchronizedList.

会很方便

可能需要 synchronizedList 的情况是,如果您将列表传递给某些未在列表上同步的第三方代码,但您仍然需要同步。但是,这很容易出错,因为您会依赖第三方代码不会遍历列表或使用其他非原子操作的事实,因此最好尽可能完全避免这种情况(例如,通过复制列表)。