3 回答
TA貢獻(xiàn)1865條經(jīng)驗(yàn) 獲得超7個(gè)贊
請(qǐng)參閱https://docs.oracle.com/javase/tutorial/collections/implementations/wrapper.html
原因是迭代是通過(guò)對(duì)集合的多次調(diào)用來(lái)完成的,集合必須組合成一個(gè)原子操作。
另請(qǐng)參閱https://www.baeldung.com/java-synchronized-collections
TA貢獻(xiàn)1794條經(jīng)驗(yàn) 獲得超8個(gè)贊
如果它不提供任何便利,我們?yōu)槭裁匆@樣做
迭代時(shí)它對(duì)您沒有幫助與不提供便利不同。
所有方法 - get、size、set等isEmpty- 都是同步的。這意味著他們可以看到在任何線程中進(jìn)行的所有寫入。
如果沒有同步,則無(wú)法保證在一個(gè)線程中進(jìn)行的更新對(duì)任何其他線程都是可見的,因此例如,一個(gè)線程可能看到大小為 5,而另一個(gè)線程看到大小為 6。
使列表同步的機(jī)制是使其所有方法synchronized:這實(shí)際上意味著方法的主體被包裝在一個(gè)synchronized (this) { ... }塊中。
該方法仍然如此iterator():那也是synchronized。但是該synchronized塊在iterator()返回時(shí)完成,而不是在您完成迭代時(shí)完成。這是語(yǔ)言設(shè)計(jì)方式的基本限制。
所以你必須通過(guò)自己添加同步塊來(lái)幫助語(yǔ)言。
TA貢獻(xiàn)1777條經(jīng)驗(yàn) 獲得超3個(gè)贊
Wrapper 用于從被包裝的集合中同步添加和刪除元素。
JavaDoc 提到迭代不同步,您需要自己同步。
* It is imperative that the user manually synchronize on the returned * list when iterating over it
但是其他訪問(wèn)操作是線程安全的,并且建立發(fā)生在關(guān)系之前(因?yàn)樗鼈兪褂?code>synchronized)。
