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
)。
添加回答
舉報