3

以上(标题)是我主要关心的问题。情况是

public class MyClass{
  CopyOnWriteArrayList<Stuff> min;
  ...
  public List<Stuff> get(){
    return min;
  }
}

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

同样,当我们这样做时,相反呢?如果我做

List<Stuff> stuffs = new ArrayList<Stuff>();
addABunchOfItems(stuffs);
CopyOnWriteArrayList safeStuff = (CopyOnWriteArrayList) stuffs;

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

4

2 回答 2

4

这:

CopyOnWriteArrayList safeStuff = (CopyOnWriteArrayList) stuffs;

不起作用,它会引发编译错误;一个ArrayList不是一个CopyOnWriteArrayList

至于“铸造” aCopyOnWriteArrayList到 a List,实际上你“不”,因为CopyOnWriteArrayList 实现List接口。

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

final List<Whatever> list = new CopyOnWriteArrayList<>();

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

final ConcurrentMap<Whatever> map = new ConcurrentHashMap<>();

如果您不需要访问ConcurrentMap.

于 2013-06-13T04:19:50.113 回答
3

将对象转换为不同的类型不会更改对象的类型。如果被转换的对象无法被转换,则 aClassCastException将在运行时引发。您需要改为创建一个新CopyOnWriteArrayList对象,例如

List<Stuff> stuffs = new CopyOnWriteArrayList<Stuff>();

在第一个示例min中,将始终能够像 a 一样被引用CopyOnWriteArrayList<Stuff>,因为List<Stuff>它不会更改其类型。

于 2013-06-13T04:19:17.317 回答