JAVA集合类

JAVA集合类

ArrayList

List<String> list = new ArrayList();
	List<String> list = new CopyOnWriteArrayList<>(new ArrayList());
	List<String> list = Collections.synchronizedList(new ArrayList());
	List<String> list = new Vector<>();
	
	/*
        * 1.故障现象
        * java.util.ConcurrentModificationException
        *
        * 2.导致原因
        *  并发争抢修改导致
        *
        * 3.解决方案
        *   3.1 new Vector()
        *   3.2 Collections.synchronizedList(new ArrayList());
        *   3.3 new CopyOnWriteArrayList<>(new ArrayList()); 写时复制
        * */
		
		/**
		 * 笔记
		 * 写时复制
		 * copyOnWrite容器即写时复制的容器。往一个容器添加元素的时候,不直接往当前容器Object[]添加,而是先将当前容器Object[]进行copy,复制出一个新的容器Object[] newElements,然后新的容器Object[] newElements里添加元素,添加完元素之后,再将原容器的引用指向新的容器 setArray(newElements);。
		 * 这样做的好处是可以对CopyOnWrite容器进行并发的读,而不需要加锁,因为当前容器不会添加任何元素。所以CopyOnWrite容器也是一种读写分离的思想,读和写不容的容器
		 *
			 public boolean add(E e) {
				 final ReentrantLock lock = this.lock;
				 lock.lock();
				 try {
					 Object[] elements = getArray();
					 int len = elements.length;
					 Object[] newElements = Arrays.copyOf(elements, len + 1);
					 newElements[len] = e;
					 setArray(newElements);
					 return true;
				 } finally {
					lock.unlock();
				 }
			 }
		*/

HashMap

public class HashMapNotSafeDemo {

    public static void main(String[] args){
        //Map<String,String> map = new HashMap<>();
        Map<String,String> map = new ConcurrentHashMap<>();
        //Map<String,String> map = Collections.synchronizedMap(new HashMap<>());
        //List<String> list = new Vector<>();
        for (int i = 0; i < 30; i++) {
            new Thread(()->{
                map.put(Thread.currentThread().getName(),UUID.randomUUID().toString().substring(0,8));
                System.out.println(map);
            },String.valueOf(i)).start();
        }

        /**
         * CopyOnWriteArraySet底层的实现其实就是CopyOnWriteArrayList
         * public CopyOnWriteArraySet() {
             al = new CopyOnWriteArrayList<E>();
         * }
         *
         * HashSet的底层是HashMap,只不过是以key为map的key,value为一个Object常量
         * private static final Object PRESENT = new Object();
         * public boolean add(E e) {
             return map.put(e, PRESENT)==null;
         }
         */


        /*
        * 1.故障现象
        * java.util.ConcurrentModificationException
        *
        * 2.导致原因
        *  并发争抢修改导致
        *
        * 3.解决方案
        *   3.1 new Vector()
        *   3.2 Collections.synchronizedList(new ArrayList());
        *   3.3 new CopyOnWriteArrayList<>(new ArrayList()); 写时复制
        * */
    }

    /**
     * 笔记
     * 写时复制
     * copyOnWrite容器即写时复制的容器。往一个容器添加元素的时候,不直接往当前容器Object[]添加,而是先将当前容器Object[]进行copy,复制出一个新的容器Object[] newElements,然后新的容器Object[] newElements里添加元素,添加完元素之后,再将原容器的引用指向新的容器 setArray(newElements);。
     * 这样做的好处是可以对CopyOnWrite容器进行并发的读,而不需要加锁,因为当前容器不会添加任何元素。所以CopyOnWrite容器也是一种读写分离的思想,读和写不容的容器
     *
         public boolean add(E e) {
             final ReentrantLock lock = this.lock;
             lock.lock();
             try {
                 Object[] elements = getArray();
                 int len = elements.length;
                 Object[] newElements = Arrays.copyOf(elements, len + 1);
                 newElements[len] = e;
                 setArray(newElements);
                 return true;
             } finally {
                lock.unlock();
             }
         }
    */
}

HashSet

	Set<String> list = new HashSet<>();
	Set<String> list = new CopyOnWriteArraySet<>();
	Set<String> list = Collections.synchronizedSet(new HashSet<>());
	for (int i = 0; i < 50; i++) {
            new Thread(()->{
                list.add(UUID.randomUUID().toString().substring(0,8));
                System.out.println(list);
            },String.valueOf(i)).start();
        }
	/**
	 * CopyOnWriteArraySet底层的实现其实就是CopyOnWriteArrayList
	 * public CopyOnWriteArraySet() {
		 al = new CopyOnWriteArrayList<E>();
	 * }
	 *
	 * HashSet的底层是HashMap,只不过是以key为map的key,value为一个Object常量
	 * private static final Object PRESENT = new Object();
	 * public boolean add(E e) {
		 return map.put(e, PRESENT)==null;
	 }
	 */
	list.add("");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值