将 CopyOnWriteArrayList 转换为 List 是否会导致其失去并发保证?

Pou*_*ald 4 java concurrency copy-on-write java.util.concurrent

以上(标题)是我主要关心的问题。而案例是

public class MyClass{
  CopyOnWriteArrayList<Stuff> min;
  ...
  public List<Stuff> get(){
    return min;
  }
}
Run Code Online (Sandbox Code Playgroud)

生成的列表是从get()负债中获得的吗?它会影响发生的事情min还是它自己的副本?例如,如果我迭代结果,get()会产生什么影响?

另外,当我们这样做的时候,相反怎么样?如果我做

List<Stuff> stuffs = new ArrayList<Stuff>();
addABunchOfItems(stuffs);
CopyOnWriteArrayList safeStuff = (CopyOnWriteArrayList) stuffs;
Run Code Online (Sandbox Code Playgroud)

关于并发支持,第三行及其之后safeStuff的状态是什么?stuffs

fge*_*fge 5

这:

CopyOnWriteArrayList safeStuff = (CopyOnWriteArrayList) stuffs;
Run Code Online (Sandbox Code Playgroud)

不起作用,会引发编译错误;anArrayList不是 a CopyOnWriteArrayList

至于将 a “转换”CopyOnWriteArrayList为 a List,实际上您“不”,因为CopyOnWriteArrayList 实现了List接口。

这意味着它尊重List合同;但在内部,它仍然是一个CopyOnWriteArrayList并且不,并发保证不会丢失。事实上,您将使用以下方法启动一个:

final List<Whatever> list = new CopyOnWriteArrayList<>();
Run Code Online (Sandbox Code Playgroud)

请注意,虽然没有用于List或 的并发实现的专用契约(接口) Set,但有一个用于Maps 的并发实现:ConcurrentMap。这并不意味着您被迫使用,例如:

final ConcurrentMap<Whatever> map = new ConcurrentHashMap<>();
Run Code Online (Sandbox Code Playgroud)

如果您不需要访问的具体方法ConcurrentMap