天天看點

Java 寫時拷貝容器CopyOnWriteArrayList的測試

測試代碼:

package copyOnWriteArrayListTest;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

class AddThread implements Runnable {
    private List<Double> list;
    public AddThread(List<Double> list) {
        this.list = list;
   }
  
  @Override
   public void run(){
      for ( int i = 0; i < 10000; i++){
        list.add(Math.random());
      }
   }
}

public class CopyOnWriteArrayListTest {

    public static final int THREAD_POOL_SIZE = 2;
    
    public static void main(String[] args) throws InterruptedException {
        // List<Double> list = new ArrayList<>();
        List<Double> list = new CopyOnWriteArrayList<>();
        ExecutorService es = Executors.newFixedThreadPool(THREAD_POOL_SIZE);
        es.execute(new AddThread(list));
        es.execute(new AddThread(list));
        
        es.shutdown();
        
        Thread.sleep(4000);
        System.out.println("OK, list length: " + list.size());

    }

}
      
Java 寫時拷貝容器CopyOnWriteArrayList的測試
/**
     * Appends the specified element to the end of this list.
     *
     * @param e element to be appended to this list
     * @return {@code true} (as specified by {@link Collection#add})
     */
    public boolean add(E e) {
        synchronized (lock) {
            Object[] es = getArray();
            int len = es.length;
            es = Arrays.copyOf(es, len + 1);
            es[len] = e;
            setArray(es);
            return true;
        }
    }      
Java 寫時拷貝容器CopyOnWriteArrayList的測試