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

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

并發修改具有同步列表的異常

并發修改具有同步列表的異常

慕桂英546537 2022-09-28 16:23:32
在以下情況下,我收到并發修改異常錯誤。發生這種情況的行標記為“并發修改例外<--------”我有一個主線程,從列表中讀取如下:List<ThemeCacheIndex> list = Collections.synchronizedList(themeCacheList);synchronized (list) {    Iterator<ThemeCacheIndex> it = list.iterator();    while (it.hasNext()) {        ThemeCacheIndex themeCacheIndex = it.next();  <-------- ConcurrentModificationException        doSomething();    }}我有一個從此列表中刪除的異步任務: @Override    protected String doInBackground(String... params) {        someElementsToRemove = calculateWhichElementsToRemove();        for(int i=0 ; i < someElementsToRemove.size() ; i++){            themeCacheList.remove(someElementsToRemove.get(i));        }    }我可以想象,它涉及并發情況,但我想通過在主線程上同步列表來防止這種情況。似乎我不理解多線程和共享對象的概念。有人可以幫助我解決這個問題嗎?如何防止此沖突?
查看完整描述

3 回答

?
萬千封印

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

異步任務代碼沒有問題。對“主”線程代碼執行此操作:


synchronized (themeCacheList) {

    Iterator<ThemeCacheIndex> it = themeCacheList.iterator();

    while (it.hasNext()) {

        ThemeCacheIndex themeCacheIndex = it.next();

        doSomething();

    }

}

如您所見,我已經刪除了,因為它是多余的,我直接在 上同步。Collections.synchronizedListthemeCacheList


查看完整回答
反對 回復 2022-09-28
?
小唯快跑啊

TA貢獻1863條經驗 獲得超2個贊

不確定我有一個好的解決方案,但我想這2個例子顯示了問題和可能的解決方案?!翱赡艿闹貜汀贝鸢笡]有顯示任何解決方案,而只是解釋了問題所在。


@Test

public void testFails(){


    List<String> arr = new ArrayList<String>();

    arr.add("I");

    arr.add("hate");

    arr.add("the");

    arr.add("ConcurrentModificationException !");


    Iterator i = arr.iterator();



    arr.remove(2);


    while(i.hasNext()){

        System.out.println(i.next());

    }

}


@Test

public void testWorks(){


    List<String> arr = new CopyOnWriteArrayList<>();

    arr.add("I");

    arr.add("hate");

    arr.add("the");

    arr.add("ConcurrentModificationException !");


    Iterator i = arr.iterator();



    arr.remove(2);


    while(i.hasNext()){

        System.out.println(i.next());

    }

}


查看完整回答
反對 回復 2022-09-28
?
汪汪一只貓

TA貢獻1898條經驗 獲得超8個贊

引用爪哇語Collections

返回由指定列表支持的同步(線程安全)列表。為了保證串行訪問,通過返回的列表完成對支持列表的所有訪問至關重要。

如果您修改了 ,則像您所做的那樣進行同步將無濟于事,因為備份列表已被修改。AsyncTaskthemeCacheList


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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