4

这段代码来自《Effective Java》一书

Object[] snapshot = list.toArray();// Locks list internally

我主要对这里的评论感兴趣。它是否在列表中unmodifiable?说一个列表在内部被锁定是什么意思?这把锁能保存多久?将 List 转换为数组是否有更好的选择?

4

4 回答 4

3

我想这意味着列表不维护对返回数组的引用,这意味着可以修改数组而不影响它来自的原始列表。同样,对列表的任何修改都不会反映在数组中。

这在线程安全方面很重要,因为这意味着您可以从线程安全的角度迭代列表的内容,而不必担心另一个线程同时改变列表的状态。从这个意义上说,列表的状态在返回的数组中被“锁定”,无论之后对列表进行什么更改 - 您都可以将其视为拍摄快照。

toArray();不会改变列表的状态 - 所以它不会使它不可修改或类似的东西。

于 2013-02-20T16:40:28.517 回答
2

就像其他人说的那样,我认为这与并发有关:

来自 java.uitl.List 的 javadoc 的文本

返回的数组将是“安全的”,因为此列表不维护对它的引用。(换句话说,即使此列表由数组支持,此方法也必须分配一个新数组)。因此,调用者可以自由修改返回的数组。

于 2013-02-20T16:51:28.570 回答
1

它关于线程安全 - 即列表到数组的转换将是线程安全的

编辑:
以最简单的方式 - 你可以把它当作

  • 何时Thread one转换List -> Array不允许其他线程更改列表,直到时间Thread one尚未完成转换
于 2013-02-20T16:44:32.787 回答
1

对于那些想知道“内部锁定”发生在哪里的人:

请注意,J. Bloch 作为给定代码的介绍写道:“例如,假设您有一个同步列表(由Collections.synchroniedList) (...) 返回的排序”

在那种情况下,toArray()真正“锁定内部”,因为同步列表的实现将做到这一点(使用互斥锁),防止在创建解耦数组时其他线程进行任何修改。

于 2014-07-23T09:25:31.143 回答