亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如果它不能保證對迭代器的同步訪問,我們為什么要使用同步集合?

如果它不能保證對迭代器的同步訪問,我們為什么要使用同步集合?

米琪卡哇伊 2022-05-25 16:17:47
例如,在下面的代碼中,我們必須在進行迭代時將列表包裝在同步塊中。Collections.synchronizedList 是否使列表同步?如果它不提供任何便利,我們為什么要這樣做?謝謝!List<Integer> list = Collections.synchronizedList( new ArrayList<>(Arrays.asList(4,3,52)));synchronized(list) {       for(int data: list)         System.out.print(data+" "); }
查看完整描述

3 回答

?
莫回無

TA貢獻1865條經驗 獲得超7個贊

請參閱https://docs.oracle.com/javase/tutorial/collections/implementations/wrapper.html

原因是迭代是通過對集合的多次調用來完成的,集合必須組合成一個原子操作。

另請參閱https://www.baeldung.com/java-synchronized-collections


查看完整回答
反對 回復 2022-05-25
?
慕田峪9158850

TA貢獻1794條經驗 獲得超7個贊

如果它不提供任何便利,我們為什么要這樣做

迭代時它對您沒有幫助與不提供便利不同。

所有方法 - get、sizesetisEmpty- 都是同步的。這意味著他們可以看到在任何線程中進行的所有寫入。

如果沒有同步,則無法保證在一個線程中進行的更新對任何其他線程都是可見的,因此例如,一個線程可能看到大小為 5,而另一個線程看到大小為 6。

使列表同步的機制是使其所有方法synchronized:這實際上意味著方法的主體被包裝在一個synchronized (this) { ... }塊中。

該方法仍然如此iterator():那也是synchronized。但是該synchronized塊在iterator()返回時完成,而不是在您完成迭代時完成。這是語言設計方式的基本限制。

所以你必須通過自己添加同步塊來幫助語言。


查看完整回答
反對 回復 2022-05-25
?
慕森王

TA貢獻1777條經驗 獲得超3個贊

Wrapper 用于從被包裝的集合中同步添加和刪除元素。

JavaDoc 提到迭代不同步,您需要自己同步。

 * It is imperative that the user manually synchronize on the returned
 * list when iterating over it

但是其他訪問操作是線程安全的,并且建立發生在關系之前(因為它們使用synchronized)。


查看完整回答
反對 回復 2022-05-25
  • 3 回答
  • 0 關注
  • 105 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號