说内容被锁定是什么意思?

时间:2013-02-20 16:38:29

标签: java arrays multithreading collections effective-java

此代码来自Effective Java

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

我主要对这里的评论感兴趣。是否列出unmodifiable列表?说内容被锁定是什么意思?这个锁有多长时间了?有没有更好的替代方法将List转换为数组?

4 个答案:

答案 0 :(得分:3)

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

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

toArray();不会改变列表的状态 - 因此它不会使其不可修改或类似的任何内容。

答案 1 :(得分:2)

与其他人一样,我认为这是关于并发性的:

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

  

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

答案 2 :(得分:1)

关于线程的安全性 - 即将列表转换为Array将是线程安全的

修改
以最简单的方式 - 您可以将其视为

  • Thread one正在转换列表 - >数组Thread one未完成转换之前,不允许其他任何线程更改列表

答案 3 :(得分:1)

对于那些想知道"内部锁定"发生:

请注意J. Bloch写的是给定代码的介绍:"例如,假设您有一个同步列表({{1}返回的排序}})(...)"

在这种情况下Collections.synchroniedList确实"锁定内部"因为同步列表的实现只会(使用互斥锁)阻止在创建解耦数组时由其他线程进行任何修改。