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