这段代码来自《Effective Java》一书
Object[] snapshot = list.toArray();// Locks list internally
我主要对这里的评论感兴趣。它是否在列表中unmodifiable
?说一个列表在内部被锁定是什么意思?这把锁能保存多久?将 List 转换为数组是否有更好的选择?
这段代码来自《Effective Java》一书
Object[] snapshot = list.toArray();// Locks list internally
我主要对这里的评论感兴趣。它是否在列表中unmodifiable
?说一个列表在内部被锁定是什么意思?这把锁能保存多久?将 List 转换为数组是否有更好的选择?
我想这意味着列表不维护对返回数组的引用,这意味着可以修改数组而不影响它来自的原始列表。同样,对列表的任何修改都不会反映在数组中。
这在线程安全方面很重要,因为这意味着您可以从线程安全的角度迭代列表的内容,而不必担心另一个线程同时改变列表的状态。从这个意义上说,列表的状态在返回的数组中被“锁定”,无论之后对列表进行什么更改 - 您都可以将其视为拍摄快照。
toArray();
不会改变列表的状态 - 所以它不会使它不可修改或类似的东西。
就像其他人说的那样,我认为这与并发有关:
来自 java.uitl.List 的 javadoc 的文本
返回的数组将是“安全的”,因为此列表不维护对它的引用。(换句话说,即使此列表由数组支持,此方法也必须分配一个新数组)。因此,调用者可以自由修改返回的数组。
它关于线程安全 - 即列表到数组的转换将是线程安全的
编辑:
以最简单的方式 - 你可以把它当作
Thread one
转换List -> Array不允许其他线程更改列表,直到时间Thread one
尚未完成转换对于那些想知道“内部锁定”发生在哪里的人:
请注意,J. Bloch 作为给定代码的介绍写道:“例如,假设您有一个同步列表(由Collections.synchroniedList
) (...) 返回的排序”
在那种情况下,toArray()
真正“锁定内部”,因为同步列表的实现将做到这一点(使用互斥锁),防止在创建解耦数组时其他线程进行任何修改。