3 回答
TA贡献1865条经验 获得超7个赞
请参阅https://docs.oracle.com/javase/tutorial/collections/implementations/wrapper.html
原因是迭代是通过对集合的多次调用来完成的,集合必须组合成一个原子操作。
另请参阅https://www.baeldung.com/java-synchronized-collections
TA贡献1794条经验 获得超7个赞
如果它不提供任何便利,我们为什么要这样做
迭代时它对您没有帮助与不提供便利不同。
所有方法 - get
、size
、set
等isEmpty
- 都是同步的。这意味着他们可以看到在任何线程中进行的所有写入。
如果没有同步,则无法保证在一个线程中进行的更新对任何其他线程都是可见的,因此例如,一个线程可能看到大小为 5,而另一个线程看到大小为 6。
使列表同步的机制是使其所有方法synchronized
:这实际上意味着方法的主体被包装在一个synchronized (this) { ... }
块中。
该方法仍然如此iterator()
:那也是synchronized
。但是该synchronized
块在iterator()
返回时完成,而不是在您完成迭代时完成。这是语言设计方式的基本限制。
所以你必须通过自己添加同步块来帮助语言。
TA贡献1777条经验 获得超3个赞
Wrapper 用于从被包装的集合中同步添加和删除元素。
JavaDoc 提到迭代不同步,您需要自己同步。
* It is imperative that the user manually synchronize on the returned * list when iterating over it
但是其他访问操作是线程安全的,并且建立发生在关系之前(因为它们使用synchronized
)。
添加回答
举报