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
这:
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。