java—如何在对map.entryset进行迭代时避免concurrentmodificationexception

ki1q1bka  于 2021-07-13  发布在  Java
关注(0)|答案(3)|浏览(499)

我有以下代码:

  1. static final Map<String, String> map = Collections.synchronizedMap(new HashMap());
  2. public static void main(String[] args) throws InterruptedException {
  3. map.put("1", "1");
  4. map.put("2", "2");
  5. new Thread(new Runnable() {
  6. @Override
  7. public void run() {
  8. for (Map.Entry<String, String> stringStringEntry : map.entrySet()) {
  9. System.out.println("after iterator");
  10. try {
  11. Thread.sleep(1000);
  12. } catch (InterruptedException e) {
  13. e.printStackTrace();
  14. }
  15. }
  16. }
  17. }).start();
  18. Thread.sleep(50);
  19. map.remove("1");
  20. System.out.println("removed");
  21. }

它产生 java.util.ConcurrentModificationException 我怎样才能避免呢?

nimxete2

nimxete21#

除非使用迭代器,否则在迭代集合时不能从集合中移除元素。使用iterator.remove()方法

gz5pxeao

gz5pxeao2#

如果你想迭代 Collections.synchronizedMap 必须显式同步迭代:

  1. synchronized (map) {
  2. for (Map.Entry<String, String> stringStringEntry : map.entrySet()) {
  3. System.out.println("after iterator");
  4. try {
  5. Thread.sleep(1000);
  6. } catch (InterruptedException e) {
  7. e.printStackTrace();
  8. }
  9. }
  10. }
vdgimpew

vdgimpew3#

你可以用 static final Map<String, String> map = new ConcurrentHashMap<>(); ```
static final Map<String, String> map = new ConcurrentHashMap<>();

public static void main(String[] args) throws InterruptedException {
map.put("1", "1");
map.put("2", "2");
new Thread(new Runnable() {
@Override
public void run() {
for (Map.Entry<String, String> stringStringEntry : map.entrySet()) {
System.out.println("after iterator");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}

  1. }
  2. }
  3. }).start();
  4. Thread.sleep(50);
  5. map.remove("1");
  6. System.out.println("removed");

}

展开查看全部

相关问题