• Java Collection与ConcurrentModificationException


    在遍历Java容器(ArrayList, LinkedList, HashSet, TreeSet, HashMap, HashTable)过程中不允许向该容器中Add/Remove元素, 否则会抛出ConcurrentModificationException

    但在Java 1.5版本以来, Java类库就提供了一个并发集合(Concurrent collection) CopyOnWriteArrayList, CopyOnWriteArraySet, ConcurrentHashMap, 这是专门为解决死锁和ConcurrentModificationException问题的. 通过使用并发集合可以避免任何显示的同步.

    CopyOnWriteArrayList是ArrayList的一种变体, 通过重新拷贝整个底层数组, 在这个拷贝的数组中实现所有的写操作. 由于内部数组不改动, 因此迭代不需要锁定, 速度也非常快. 但如果大量使用, CopyOnWriteArrayList的性能将大受影响.

    Observer:

    1 interface SetObserver<E>{
    2     public void added(ObservableSet<E> set, E element);
    3 }
     1 package com.ai.concurrentTest;
     2 
     3 import java.util.ArrayList;
     4 import java.util.HashSet;
     5 import java.util.List;
     6 
     7 public class ObservableSet<E> extends HashSet<E> {
     8 
     9     private static final long serialVersionUID = 1L;
    10 
    11     public ObservableSet(){
    12     }
    13     
    14     private final List<SetObserver<E>> observers = new ArrayList<SetObserver<E>>();
    15     
    16     public void addObserver(SetObserver<E> observer){
    17         synchronized(observers){
    18             observers.add(observer);
    19         }
    20     }
    21     
    22     public void removeObserver(SetObserver<E> observer){
    23         synchronized(observers){
    24             observers.remove(observer);
    25         }
    26     }
    27     
    28     private void notifyElementAdded(E element){
    29         synchronized(observers){
    30             for(SetObserver<E> observer: observers){
    31                 observer.added(this, element);
    32             }
    33         }
    34     }
    35     
    36     public boolean add(E element){
    37         boolean added = super.add(element);
    38         if(added)
    39             notifyElementAdded(element);
    40         return added;
    41     }
    42     
    43     public static void main(String[] args){
    44         ObservableSet<Integer> set = new ObservableSet<Integer>();
    45         set.addObserver(new SetObserver<Integer>() {
    46 
    47             @Override
    48             public void added(ObservableSet<Integer> set, Integer element) {
    49                 System.out.println("Observer 1: "+element);
    50                 
    51             }
    52         });
    53         set.addObserver(new SetObserver<Integer>() {
    54 
    55             @Override
    56             public void added(ObservableSet<Integer> set, Integer element) {
    57                 System.out.println("Observer 2 and add another observer: "+element);
    58 //                set.removeObserver(this);
    59                 set.addObserver(new SetObserver<Integer>() {
    60 
    61                     @Override
    62                     public void added(ObservableSet<Integer> set,
    63                             Integer element) {
    64                         System.out.println("This is new observer.");
    65                         
    66                     }
    67                 });
    68             }
    69         });
    70         
    71         for(int i=0; i<100; i++){
    72             set.add(i);
    73         }
    74     }
    75     
    76     
    77 }
    
  • 相关阅读:
    iOS核心动画高级技巧之核心动画(三)
    iOS核心动画高级技巧之图层变换和专用图层(二)
    iOS核心动画高级技巧之CALayer(一)
    Swift高级语法学习总结
    Swift基础语法学习总结
    Swift语法总结补充(一)
    【思图佳预约(一)】在做预约挂号小程序时,text标签出现一截多余的空白?
    【随笔】清除浮动float的几种办法
    ----原生js实现飞机大战小游戏<第二篇>----@半城言沙
    ----原生js实现飞机大战小游戏<第一篇>----@半城言沙
  • 原文地址:https://www.cnblogs.com/davidwang/p/3498992.html
Copyright © 2020-2023  润新知